我寫了一個程序,可以生成這樣的正則表達式a(b|)c
。其實,這意味着(abc)|(ac)
。但是a(b|)c
對於任何正則表達式引擎都是可接受的正則表達式?或者有沒有其他的選擇可以給出相同的語義?這個正則表達式是否是非法的「a(b |)c」?
進一步的問題:是否有任何工具可以將它轉換爲「正常」表示?例如將a(b|(c|))d
改爲a(b|(c)?)d
我寫了一個程序,可以生成這樣的正則表達式a(b|)c
。其實,這意味着(abc)|(ac)
。但是a(b|)c
對於任何正則表達式引擎都是可接受的正則表達式?或者有沒有其他的選擇可以給出相同的語義?這個正則表達式是否是非法的「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
這是可以接受的,只是這樣寫就很奇怪。 – nhahtdh 2012-07-19 15:11:46
它不一定適用於任何_any_正則表達式引擎,但它將用於常見的類Perl風格。 – MRAB 2012-07-19 18:29:24