2012-07-19 92 views
2

我寫了一個程序,可以生成這樣的正則表達式a(b|)c。其實,這意味着(abc)|(ac)。但是a(b|)c對於任何正則表達式引擎都是可接受的正則表達式?或者有沒有其他的選擇可以給出相同的語義?這個正則表達式是否是非法的「a(b |)c」?

進一步的問題:是否有任何工具可以將它轉換爲「正常」表示?例如將a(b|(c|))d改爲a(b|(c)?)d

+2

這是可以接受的,只是這樣寫就很奇怪。 – nhahtdh 2012-07-19 15:11:46

+0

它不一定適用於任何_any_正則表達式引擎,但它將用於常見的類Perl風格。 – MRAB 2012-07-19 18:29:24

回答

3

ab?cab{0,1}c會更有意義。一個a,其次是最多一個b,然後是c

2

使用正則表達式ab?c

4

這是不是非法的,但它是一個非常奇怪的形成。 ?對於這個目的來說更「地道」(我的意思是它更清晰,更容易被正則表達式的「發言人」理解)。

+0

但是,正如OP所述,_「我寫了一個可以生成正則表達式的程序」。這不是關於編寫慣用正則表達式,而是關於程序生成的正則表達式是否會工作**。否-1,但是,因爲你正確地表示它不是非法的。 – Phrogz 2012-07-19 15:16:04

+0

@Progrog:不一定遵循。他的程序可能會產生一個後來由人類維護的正則表達式,在這種情況下,成語很重要。 – chaos 2012-07-19 15:17:45

+0

一個技術上有效的點(雖然我個人認爲這種情況是不太可能的,我不認爲它默認有效,沒有OP陳述如此:) – Phrogz 2012-07-19 15:19:43

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 
相關問題