这个正则表达式"a(b|)c"是非法的吗?



我写了一个程序,可以像这样生成正则表达式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

最新更新