2

私はこの正規表現を持っており/\b\d\b/、単に1桁の単語に一致します。

ここで、単語境界の代わりにアンダースコア文字を追加したいので"_1_"、アンダースコアを長さゼロの一致として維持しながら、数字も一致させたいと思います (\b のように、マッチに _ が必要です)。

私は、キャプチャグループを使用するのが理想的ではない場合があります。

私はいくつかのポジティブなルック・アヘッド/ビハインド・トリックを試しました。オプションのルックアヘッド/ビハインドを実行して、 のようなことを試み_|\bましたが、これに対する理想的な解決策を見つけることができませんでした。

高度な RegEx トリックに精通していないので、2 つの RegEx でこれを行う前に質問したいと思いました :)

これは JavaScript で実行されます。

4

2 に答える 2

2

(?<=\b|_)\d(?=\b|_)

(?<=    # Positive look-behind
\b      # Word boundary
|       # Or
_       # Underscore
)       # End group
\d      # Digit
(?=     # Positive look-ahead
\b|_)   # Word boundary or underscore

1桁の数字と一致し、単語の境界(\b)またはアンダースコア()のいずれかを使用_して一致します。

これは長さがゼロであるため、一致する数字をグループ化しません。

ここで正規表現を試してください

于 2012-07-03T16:50:43.917 に答える
1

後読みは JS では機能しないため、メインの正規表現のみを一致させて\dから、手動で境界を確認できます。

const manualBoundaries = /\d/g
const matches = [];
while ((match = manualBoundaries.exec(str)) !== null) {
  const m = match[0]
  const i = match.index
  if ((i == 0 || str[i - 1].match(/(\W|_)/)) &&
      (i + m.length == str.length || str[i + m.length].match(/(\W|_)/)))
    matches.push(m)
}

またはより簡潔に言えば、偽の置換を使用して

const matches = [];
str.replace(manualBoundaries, (m, i) => {
    if ((i == 0 || str[i - 1].match(/(\W|_)/)) &&
        (i + m.length == str.length || str[i + m.length].match(/(\W|_)/)))
      matches.push(m);
});

ここで試してみてください: https://jsfiddle.net/djjeck/mg2gzpf1/

于 2016-10-28T19:36:54.603 に答える