å¥ã®ãã¿ã¼ã³ãç¶ãããããã¯å è¡ãããã¿ã¼ã³ã«ããããããã®ã ããæ¢ããããã¨ãããã¾ãã
ãã®ããã®ç¹å¥ãªæ§æãããããã㯠âå èªã¿â, âå¾èªã¿â ã¨å¼ã°ããã¾ã¨ã㦠âlookaroundâ ã¨å¼ã°ãã¾ãã
ã¾ãã1 turkey costs 30⬠ã¨ãã£ãæååããä¾¡æ ¼ãæ¢ãã¦ã¿ã¾ããããã¤ã¾ã: æ°å¤ã®å¾ã« ⬠è¨å·ãç¶ãã¾ãã
å èªã¿(Lookahead)
æ§æã¯: X(?=Y)ã§ãâX ãæ¢ããã©ãY ãç¶ãå ´åã«ã ããããããâ ãæå³ãã¾ããX ã Y ã¯ä»»æã®ãã¿ã¼ã³ã«ãªãã¾ãã
æ´æ°å¤ã®å¾ã« ⬠ãç¶ãå ´åãæ£è¦è¡¨ç¾ã¯ \d+(?=â¬) ã¨ãªãã¾ã:
let str = "1 turkey costs 30â¬";
alert( str.match(/\d+(?=â¬)/) ); // 30, æ°å¤ 1 㯠⬠ãç¶ãã¦ãªãã®ã§ç¡è¦ããã¾ã
注æ: å
èªã¿ã¯åãªããã¹ãã§ãããæ¬å¼§ã®ä¸èº« (?=...) ã¯çµæ 30 ã«ã¯å«ã¾ãã¾ããã
X(?=Y) ãæ¢ãã¨ããæ£è¦è¡¨ç¾ã¨ã³ã¸ã³ã¯ X ãè¦ã¤ããæ¬¡ã«ãã®ç´å¾ã« Y ããããããã§ãã¯ãã¾ãããããªããã°ããããã¯ã¹ãããããæ¤ç´¢ãç¶ãã¾ãã
ãã£ã¨è¤éãªãã¹ããå¯è½ã§ããä¾ãã°ãX(?=Y)(?=Z) ã¯æ¬¡ã®æå³ã«ãªãã¾ã:
Xãè¦ã¤ãã¾ããYãXã®ç´å¾ã§ããããã§ãã¯ãã¾ã(ããã§ãªããã°ã¹ããããã¾ã)ãZãXã®ç´å¾ã§ããããã§ãã¯ãã¾ã(ããã§ãªããã°ã¹ããããã¾ã)ã- 両æ¹ã®ãã¹ããéãã°ããããã«ãªãã¾ãã
è¨ãæããã¨ããã®ãããªãã¿ã¼ã³ã¯ X ã®å¾ã« Y, Z ãåæã«ç¶ããã¨ãæå³ãã¾ãã
ããã¯ããã¿ã¼ã³ Y 㨠Z ãç¸äºã«æä»çã§ãªãå ´åã«ã®ã¿å¯è½ã§ãã
ä¾ãã°ã\d+(?=\s)(?=.*30) ã¯ç´å¾ã«ã¹ãã¼ã¹ãããããã®ä»¥éã®ã©ããã§ 30 ããã \d+ ãæ¢ãã¾ãã:
let str = "1 turkey costs 30â¬";
alert( str.match(/\d+(?=\s)(?=.*30)/) ); // 1
ä¸ã®æååã§ã¯ãæ°å¤ 1 ã«æ£ç¢ºã«ããããã¾ãã
å¦å®å èªã¿(Negative lookahead)
åãæååãããä¾¡æ ¼ã§ã¯ãªãæ°éãã»ããã¨ãã¾ããããããã¯æ°å¤ \d+ ã§ã⬠ãç¶ããªããã®ã¨ãã¾ãã
ãã®ããã«ãå¦å®å èªã¿ãé©ç¨ã§ãã¾ãã
æ§æã¯ X(?!Y) ã§ãæå³ã¯ âX ãæ¢ãããY ãç¶ããªãå ´åã®ã¿â ã§ãã
let str = "2 turkeys cost 60â¬";
alert( str.match(/\d+(?!â¬)/) ); // 2 (ä¾¡æ ¼é¨åã¯ã¹ãããããã¾ãã)
å¾èªã¿(Lookbehind)
å èªã¿ã§ã¯ âå (ä½ãç¶ãã)â ãæ¡ä»¶ã«ä»ãå ãããã¨ãã§ãã¾ãã
å¾èªã¿ãä¼¼ã¦ãã¾ãããããã¯å¾ããè¦ã¾ããã¤ã¾ãããã¿ã¼ã³ã®åã«ä½ããããå ´åã«ã®ã¿ããããããã¨ãã£ããã¨ãå¯è½ã«ãã¾ãã
æ§æã¯æ¬¡ã®éãã§ã:
- è¯å®å¾èªã¿(Positive lookbehind):
(?<=Y)Xã¯Xã®åã«Yãããå ´åã«ã®ã¿ããããããã¨ãæå³ãã¾ãã - å¦å®å¾èªã¿(Negative lookbehind):
(?<!Y)Xã¯Xã®åã«Yããªãå ´åã«ã®ã¿ããããããã¨ãæå³ãã¾ãã
ä¾ãã°ãä¾¡æ ¼ãUSãã«ã«å¤ãã¦ã¿ã¾ãããããã«è¨å·ã¯é常æ°å¤ã®åãªã®ã§ã$30 ãæ¢ãã«ã¯ (?<=\$)\d+ â $ ã§å§ã¾ãæ°é â ã使ãã¾ãã:
let str = "1 turkey costs $30";
// ãã«è¨å·ã¯ \$ ã«ã¨ã¹ã±ã¼ãããã¾ã
alert( str.match(/(?<=\$)\d+/) ); // 30 (æ°å¤åä½ã¯ã¹ãããããã¾ã)
ã¾ããæ°é â $ ããå§ã¾ããªãæ°å¤ â ãå¿
è¦ãªå ´åãå¦å®å¾èªã¿ (?<!\$)\d+ ãå©ç¨ã§ãã¾ãã:
let str = "2 turkeys cost $60";
alert( str.match(/(?<!\$)\d+/) ); // 2 (ä¾¡æ ¼ã¯ã¹ãããããã¾ã)
ãã£ããã£ã°ã«ã¼ã
ä¸è¬çã«ãlookaround ã®æ¬å¼§å ã®å 容ã¯çµæã®ä¸é¨ã«ã¯ãªãã¾ããã
E.g. ãã¿ã¼ã³ \d+(?=â¬) ã§ã¯ã⬠è¨å·ã¯ãããã®ä¸é¨ã¨ãã¦ãã£ããã£ã¯ããã¾ãããããã¯èªç¶ãªãã¨ã§ã: ç§ãã¡ã¯ \d+ ãæ¢ãã¦ãã䏿¹ã§ã(?=â¬) ã¯å㫠⬠ãç¶ããã©ããã®ãã¹ãã§ãã
ããããç¶æ³ã«ãã£ã¦ã¯åæ§ã« lookaround å¼ãã¾ãã¯ãã®ä¸é¨ããã£ããã£ãããããããã¾ãããããã¯å¯è½ã§ããåã«è¿½å ã§æ¬å¼§ã§å²ãã°ããã§ãã
以ä¸ã®ä¾ã§ã¯ãéé¡ã¨ä¸ç·ã«é貨è¨å· (â¬|kr) ããã£ããã£ããã¾ãã:
let str = "1 turkey costs 30â¬";
let regexp = /\d+(?=(â¬|kr))/; // â¬|kr ã®å¨ãã«è¿½å ã®æ¬å¼§
alert( str.match(regexp) ); // 30, â¬
å¾èªã¿ã®å ´åãåãã§ã:
let str = "1 turkey costs $30";
let regexp = /(?<=(\$|£))\d+/;
alert( str.match(regexp) ); // 30, $
ãµããª
å èªã¿(Lookahead)ã¨å¾èªã¿(lookbehind)(ããã㦠âlookaroundâ ã¨å¼ã°ãã¾ã)ã¯ããã®åå¾ã®ã³ã³ããã¹ãã«å¿ãã¦ä½ãããããããããå ´åã«å½¹ç«ã¡ã¾ãã
åç´ãªæ£è¦è¡¨ç¾ã®å ´åã¯æåã§åæ§ã®ãã¨ãã§ãã¾ããã¤ã¾ã: ä»»æã®ã³ã³ããã¹ãã§ãã¹ã¦ã«ããããããå¾ãã«ã¼ãã§ãã£ã«ã¿ãã¾ãã
str.match (ãã©ã° g ãªã)㨠str.matchAll (常ã«)㯠index ããããã£ããã¤é
åã¨ãã¦ä¸è´ãè¿ããããããã¹ãã®ä¸ã§ã®æ£ç¢ºãªä½ç½®ãåããã³ã³ããã¹ãã確èªã§ãããã¨ãè¦ãã¦ããã¦ãã ããã
ã§ãããä¸è¬çã«ã¯ lookaround ã®ã»ãã便å©ã§ãã
Lookaround ã®ã¿ã¤ã:

ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã