このような正規表現を生成できるプログラムを作成しましたa(b|)c
。実際には、それはを意味し(abc)|(ac)
ます。しかしa(b|)c
、どの正規表現エンジンでも許容できる正規表現はありますか?または、同じ意味を与える他の方法はありますか?
さらなる質問:それを「通常の」表現に変換できるツールはありますか?例a(b|(c|))d
:a(b|(c)?)d
このような正規表現を生成できるプログラムを作成しましたa(b|)c
。実際には、それはを意味し(abc)|(ac)
ます。しかしa(b|)c
、どの正規表現エンジンでも許容できる正規表現はありますか?または、同じ意味を与える他の方法はありますか?
さらなる質問:それを「通常の」表現に変換できるツールはありますか?例a(b|(c|))d
:a(b|(c)?)d
それは違法ではありませんが、それは非常に奇妙な形成です。 ?
目的のためにより「慣用的」です(つまり、正規表現の「話者」にとってより明確で、より容易に理解されることを意味します)。
ab?c
、またはab{0,1}c
もっと意味があります。、a
その後に最大1つb
、その後にc
。
この正規表現を使用するab?c
はい、これは有効な正規表現です。Rubyでの証明:
irb(main):003:0> "fooacbar".match( /a(b|)c/ )
#=> #<MatchData "ac" 1:"">
irb(main):004:0> "fooabcbar".match( /a(b|)c/ )
#=> #<MatchData "abc" 1:"b">
JavaScriptでの証明:
console.log( "fooabcbar".match(/a(b|)c/) )
//-> ["abc", "b"]
console.log( "fooacbar".match(/a(b|)c/) )
//-> ["ac", ""]
ただし、他の人が示しているように、次のように書く方が慣用的です。
/ab?c/ # If you have just one character optional
/a(foo)?c/ # If you have an arbitrary string optional
また、多くの正規表現エンジンでは、括弧がキャプチャされないことを指定できることに注意してください(これにより、パフォーマンスがわずかに向上する場合があります)。
/a(?:foo)?c/ # Optional arbitrary string that you don't need to save