3

barたとえば、:foobarまたは。で終わる文字列を照合したいと思いbarます。このような正規表現は次のようになります/^.*bar$/

uまた、接頭辞が文字である文字列を除外したいと思いbarます。たとえば、これらの文字列は正規表現と一致しないようにする必要があります:ubarまたはfooubar。試し/^.*[^u]?bar$/ましたが、うまくいきません。どうすればこれを修正できますか?

4

3 に答える 3

4

プレフィックス全体をかっこで囲むだけです

^(.*[^u])?bar$

これを行うことにより、の前に少なくとも1つの非u文字があった場合に、それ以降の先行文字のみを許可しますbar

または、正規表現エンジンがネガティブルックビハインドをサポートしている場合は、次のようにすることができます。

^.*(?<!u)bar$

この正規表現がそのbar左側の文字を見て、一致しようとする前の位置に到達したときu。それが不可能な場合、試合は続行されます。が見つかった場合、u後読みはパターンを失敗させます。これは、文字以外の文字があるu場合と、文字列の先頭である場合の両方で機能します。

さわがコメントで指摘したように、文字列が:^.*で終わるかどうかを確認したいだけなら、も必要ありません。bar

(?<!u)bar$

もちろん、何らかの理由で文字列全体を一致に含めたい場合(マルチラインモードを使用した行の置換または一致)は、^.*が必要です。最初の正規表現では、それを除外できないことに注意してください。ただし、次のように変更できます

([^u]|^)bar$

これにより、文字列全体の一致も回避されます。

于 2012-11-16T17:22:19.983 に答える
1

の前にあるすべてのものをグループ化?します()。これには、「前にあるオプションの構造全体barが存在する場合は、それで終わってはならないuという効果があります。

たとえば、JavaScriptの場合:

/^(.*[^u])?bar$/.test("foobar");
// true

/^(.*[^u])?bar$/.test("fooubar");
// false

/^(.*[^u])?bar$/.test("bar");
// true

/^(.*[^u])?bar$/.test("ubar");
// false
于 2012-11-16T17:21:51.127 に答える
1

後読みを使用します。

def match_bar? string
  string =~ /(?<!u)bar\z/
end

%w{foobar ubar fooubar}.each do |example|
  puts "#{example} does #{match_bar?(example) ? '' : 'not'} match the regex."
end

出力:

foobar does  match the regex.
ubar does not match the regex.
fooubar does not match the regex.
于 2012-11-16T17:39:34.020 に答える