2

我写了一个可以像这样生成正则表达式的程序a(b|)c。其实,意思是(abc)|(ac)。但是a(b|)c对于任何正则表达式引擎来说都是可接受的正则表达式吗?或者有没有其他替代方法可以给出相同的语义含义?

进一步的问题:是否有任何工具可以将其转换为“正常”表示?例如转换a(b|(c|))da(b|(c)?)d

4

4 回答 4

4

这不是非法的,但这是一个非常奇怪的阵型。 ?就目的而言,它更“惯用”(我的意思是,正则表达式的“演讲者”会更清楚,更容易理解)。

于 2012-07-19T15:12:17.947 回答
3

ab?c,或者ab{0,1}c会更有意义。一个a,后跟最多一个b,后跟一个c

于 2012-07-19T15:11:08.397 回答
2

使用这个正则表达式ab?c

于 2012-07-19T15:11:40.927 回答
1

是的,这是一个有效的正则表达式。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
于 2012-07-19T15:12:29.413 回答