我写了一个程序,可以像这样生成正则表达式a(b|)c
。实际上,这意味着(abc)|(ac)
.但是a(b|)c
是任何正则表达式引擎可接受的正则表达式吗?还是有其他替代方法可以赋予相同的语义含义?
进一步的问题:是否有任何工具可以将其隐藏为"正常"表示?例如将a(b|(c|))d
转换为a(b|(c)?)d
这并不违法,但这是一种非常奇怪的阵型。 ?
的目的更"惯用"(我的意思是正则表达式的"说话者"会更清楚,更容易理解(。
ab?c
,或者ab{0,1}c
会更有意义。一个a
,后跟最多一个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