bar
たとえば、:foobar
または。で終わる文字列を照合したいと思いbar
ます。このような正規表現は次のようになります/^.*bar$/
。
u
また、接頭辞が文字である文字列を除外したいと思いbar
ます。たとえば、これらの文字列は正規表現と一致しないようにする必要があります:ubar
またはfooubar
。試し/^.*[^u]?bar$/
ましたが、うまくいきません。どうすればこれを修正できますか?
プレフィックス全体をかっこで囲むだけです
^(.*[^u])?bar$
これを行うことにより、の前に少なくとも1つの非u
文字があった場合に、それ以降の先行文字のみを許可しますbar
。
または、正規表現エンジンがネガティブルックビハインドをサポートしている場合は、次のようにすることができます。
^.*(?<!u)bar$
この正規表現がそのbar
左側の文字を見て、一致しようとする前の位置に到達したときu
。それが不可能な場合、試合は続行されます。が見つかった場合、u
後読みはパターンを失敗させます。これは、文字以外の文字があるu
場合と、文字列の先頭である場合の両方で機能します。
さわがコメントで指摘したように、文字列が:^.*
で終わるかどうかを確認したいだけなら、も必要ありません。bar
(?<!u)bar$
もちろん、何らかの理由で文字列全体を一致に含めたい場合(マルチラインモードを使用した行の置換または一致)は、^.*
が必要です。最初の正規表現では、それを除外できないことに注意してください。ただし、次のように変更できます
([^u]|^)bar$
これにより、文字列全体の一致も回避されます。
の前にあるすべてのものをグループ化?
します()
。これには、「前にあるオプションの構造全体bar
が存在する場合は、それで終わってはならないu
」という効果があります。
たとえば、JavaScriptの場合:
/^(.*[^u])?bar$/.test("foobar");
// true
/^(.*[^u])?bar$/.test("fooubar");
// false
/^(.*[^u])?bar$/.test("bar");
// true
/^(.*[^u])?bar$/.test("ubar");
// false
後読みを使用します。
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.