正規表現(補足)および一般的な例

3473 ワード

正規の特性:1.貪欲性:貪欲性とは、捕獲時に、条件に合った内容を一度にできるだけ多く捕獲することである.条件に合ったコンテンツをできるだけ少なくキャプチャしたい場合は、メタ文字の後に加算できますか?
2.怠惰性:一度捕獲した後、後で条件に合っているかどうかにかかわらず、二度と捕獲しない.すべての適合コンテンツをキャプチャするためのグローバルフラグg
var str='123aaa456';
var re=/\d+/;//     。         
var res=str.match(re);
console.log(res);//['123',index:0,input:'123aaa456']
re=/\d+?/g;//     、   
res=str.match(re);
console.log(res);//['1','2','3','4','5','6']

 
ゼロ幅の断言:
いくつかのコンテンツ(これらのコンテンツを含まない)の前または後のものを検索するために使用されます.例えば、b,^,$は、位置を指定するために使用され、この位置は一定の条件を満たすべきです(すなわち、断言)
正規表現を使用する場合、キャプチャされたコンテンツの前後は特定のコンテンツでなければなりませんが、私たちがこれらの特定のコンテンツをキャプチャしたくない場合は、ゼロ幅断言が役に立ちます.
1.ゼロ幅正予測先行断言(?=exp)
2.ゼロ幅負予測先行断言(?!exp)
3.ゼロ幅正回顧後発断言(?<=exp)
4.ゼロ幅負回顧後発断言(?
 
1.(?=exp)は文字が現れる位置の右側がexpという式に一致しなければならない
例:
var str='i'm singing and dancing';
var re=/\b(\w+(?=ing\b))/g;
var res=str.match(re);
console.log(res);//['sing','danc']

注意:ここでは位置を指し、文字ではありません
var str = 'abc';
var reg = /a(?=b)c/;
console.log(res.test(str)); 

これは正しいように見えますが、実際にはfalseです.
理由:reg中a(?=b)マッチング文字列'abc'文字列aの右側がbというマッチングは問題ありませんが、次にreg中a(?=b)の後ろのcが文字列'abc'中の位置aの後ろのbの前のこの位置からマッチングし始めます.これは/ac/マッチング'abc'に相当し、明らかにfalseとなります
2.(?!exp)これは文字が現れる位置の右側がexpという表現ではないということです.
var str = 'nodejs';
var reg = /node(?!js)/;
console.log(reg.test(str)) // false

3.(?<=exp)これは文字が現れる位置の前にexpという表現です.
var str = '¥998$888';
var reg = /(?<=\$)\d+/;
console.log(reg.exec(str)) //888

4.(?位置の前にexpという表現はできません.
var str = '¥998$888';
var reg = /(?

 
一般的な正則例:1.スペースを削除:
var str = '  hello  ';
alert( '('+trim(str)+')' );//            。 (hello)
function trim(str){
   var re = /^\s+|\s+$/g; // |       \s      +                                   
  return str.replace(re,''); //       
}

2.1文字列の中で最も多く出現した文字を判断し、回数を統計する
var str = 'abbbbAAbcBCCccdaACBDDabcccddddaab';
 str = str.toLowerCase().split('').sort(function(a,b){return a.localeCompare(b)}).join(''); 
var reg = /(\w)\1+/ig;
 var maxStr = '';
 var maxLen = 0; 
str.replace(reg,function($0,$1){
 var regLen = $0.length;
 if(regLen>maxLen)
{ maxLen = regLen; maxStr = $1; }
else if(maxLen == regLen)
{ maxStr += $1; } });
 console.log(`        ${maxStr},    ${maxLen} `)

3.千分位区切り文字
function thousandBitSeparator(num) {
  return num && (num
    .toString().indexOf('.') != -1 ? num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {
      return $1 + ",";
    }) : num.toString().replace(/(\d)(?=(\d{3}))/g, function($0, $1) {
      return $1 + ",";
    }));
}
console.log(thousandBitSeparator(1000));

4.2013-6-7を2013.6.7にする
var str = '2013-6-7';
var re = /(\d+)(-)/g;
str = str.replace(re,function($0,$1,$2){
    
       //replace()      ,
      //     :$0(            2013-  6-),
         //       : $1(          ,     \d   2013, 6)
        //      : $2(          ,      - - )   
    return $1 + '.';  //    2013.   6.
    
});
alert( str );   //2013.6.7
//           2013- 6-       2013. 6.      2013.6.7