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