2017-09-21 7 views
0

結果の一致は同じではありませんしかし、私はthis questionJavascriptのワード境界

で提案されたこの答えを見てきました。マッチが文字列の先頭にある場合、文字列が返されますが、空白の後でマッチすると、空白もマッチの一部として返されます。キャプチャされていないコロンが使用されています。私は次のコードでテスト

は、Firefoxのコンソールです:

let str1 = "un ejemplo"; 
 
let str2 = "ejemplo uno"; 
 
let reg = /(?:^|\s)un/gi; 
 
console.log(str1.match(reg)); // ["un"] 
 
console.log(str2.match(reg)); // [" un"]

空白が返されているのはなぜ?

+3

非キャプチャは非マッチングを意味するものではありません。 '(?:\ s)'は、 '\ s'はグループと一致するが、グループの一部ではないことを意味します。 – Gurman

+0

両方の出力を同じにする方法はありますか? –

+1

この場合、 '\ bun'だけを使ってみませんか? https://regex101.com/r/Y1BDzy/29 – Gurman

答えて

3

(?:^|\s)のコロンは、それが非捕捉グループであることを意味します。つまり、取得したグループ値を読み込み、逆参照、または置換するときは、その値は含まれません。コロンがなければ、それは\1として参照可能ですが、コロンで参照する方法はありません。ただし、非キャプチャグループは、デフォルトではまだマッチに含まれています。たとえば、My (?:dog|cat) is sickには、捕捉していないグループであっても、単語dogまたはcatが一致します。

値を除外するには、2つの方法があります。あなたの正規表現エンジンが否定的なルックバックをサポートしている場合は、それらのうちの1つを使用することができます((?!<^|\s)など)。そうでない場合(JavaScriptのエンジンは残念ながらJavaScriptのエンジンの1つではありません)、必要な部分だけにキャプチャグループを置き、マッチ全体ではなくグループの値を読み取ることができます(たとえば、(?:^|\s)(un))。例えば:

let reg = /(?:^|\s)(un)/gi; 
let match = reg.exec(input) 
let result = match[1]; 
+0

私は実行しました: 'reg2 = /(?:^ | \ s)(un)/ gi; str2.match(reg2) '私の質問のコマンドの後にまだ空白との一致を得る –

+0

' match'は完全一致を返します。キャプチャグループの値だけを読む必要があります。私は例を追加しました。 –

+0

これは私のために働いていないようです –

1

一つの解決策は、あなたがRegExp.prototype.exec()を使用して、このようなマッチした文字列を、取得するには、この結果のmatch[1]を使用できるようにキャプチャグループ(すなわち(un))を使用することです:

let str1 = "un ejemplo"; 
 
let str2 = "ejemplo uno"; 
 
let reg = /(?:^|\s)(un)/gi; 
 
var match1 = reg.exec(str1); 
 
var match2 = reg.exec(str2); 
 
console.log(match1[1]); // ["un"] 
 
console.log(match2[1]); // ["un"]