正規表現はregex101.comでは機能しますが、prodでは機能しません。質問する

正規表現はregex101.comでは機能しますが、prodでは機能しません。質問する

https://regex101.com/r/sB9wW6/1

(?:(?<=\s)|^)@(\S+)<-- 肯定的な後読みの問題

prod:でこのように作業しています(?:\s|^)@(\S+)が、正しい開始インデックス (スペースなし) が必要です。

JS では次のようになります:

var regex = new RegExp(/(?:(?<=\s)|^)@(\S+)/g);

正規表現の解析エラー: 無効な正規表現: /(?:(?<=\s)|^)@(\S+)/

何が間違っているのでしょうか?

アップデート

OK、JS では後読みは不要です :(

しかし、いずれにせよ、一致の適切な開始インデックスと終了インデックスを取得するには正規表現が必要です。先頭のスペースなしで。

ベストアンサー1

regex101.comでは常に正しい正規表現エンジンを選択してください使用により発生した問題を参照してください[^]Python の構文を使用した JS のみ互換の正規表現

JS正規表現 -この質問に答える時点で- 後読みをサポートしていませんでした。現在では、後読みがますます採用されるようになっています。ECMAScript 2018での導入キャプチャ グループを使用できるため、ここで実際には必要ありません。

var re = /(?:\s|^)@(\S+)/g; 
var str = 's  @vln1\n@vln2\n';
var res = [];
while ((m = re.exec(str)) !== null) {
  res.push(m[1]);
}
console.log(res);

(?:\s|^)@(\S+)空白または を含む文字列の先頭に一致し(?:\s|^)、次に に一致し@、次に に一致します。キャプチャグループ 1 に、 . を含む 1 つ以上の空白以外の文字を追加します(\S+)

開始/終了インデックスを取得するには、

var re = /(\s|^)@\S+/g; 
var str = 's  @vln1\n@vln2\n';
var pos = [];
while ((m = re.exec(str)) !== null) {
  pos.push([m.index+m[1].length, m.index+m[0].length]);
}
console.log(pos);

ボーナス

私の正規表現は regex101.com では機能しますが、... では機能しません。

おすすめ記事