2011-08-28 57 views
0

例如,假設我想匹配一個大寫字母A-Z,但不是F-H。如果我沒有弄錯,大寫字母將是[A-Z],而不是F-H將是[^F-H]。直覺上,我希望它是[A-Z^F-H],但似乎沒有工作。我知道它可以完成[A-EI-Z],但我正在尋找更少的解決方法。編輯:尋找更一般的解決方案。如何匹配一組中的字符,但不匹配第一組中的字符?

+0

'[A-EI-Z]'是一種「解決方法」?它似乎很清楚地描述了模式。 –

+0

對於我提供的例子,是的,但是如果我不想要的字符在運行時才指定?有沒有辦法說「我想要任何不是_x_的大寫字母」,其中_x_可以是任何字母。 – Fred

回答

0

沒有什麼是「少了解決方法」。字符範圍語法(如[abcdef])僅用於匹配任何枚舉字符。它可以像[^abcdef]那樣倒置。然後提供[a-f]作爲明確寫出所有字符的語法簡寫。如果您想匹配多個範圍並在它們之間存在空隙,則必須指定多個範圍。

如果flex支持postivie/negative lookahead/lookbehind,您可以嘗試使用這些功能。我願意打賭,它會出現更復雜的閱讀方式,並且效率遠遠低於只寫[A-EI-Z]

編輯:在閱讀您的評論之後,您的範圍中想要的「洞」可能在運行時纔會被發現,您必須使用lookahead/lookbehind來完成。這個語法在正則表達式引擎之間有所不同,我不確定flex是否可以這樣做。基本上你會想要一個匹配[A-Z]的正則表達式,對於[F-H]有一個負面的後向斷言。或者匹配[^F-H]後跟[A-Z]的肯定前瞻斷言。

關於lookahead/lookbehead的關鍵在於它們實際上並不消耗任何輸入,如果在當前匹配位置不符合斷言,它們只會導致匹配失敗。它們的效率通常比直接處理效率低(如果可以的話),並且可能會非常棘手,而且不同的正則表達式引擎在可以使用和不能使用它們時似乎有不同的限制。

+0

謝謝。我想我會嘗試使用開始條件,看看如何。看起來似乎變得混亂。 – Fred

+0

除非最近事情發生了很大變化,否則flex沒有任何高級功能,比如lookahead或lookbehind。 –

0

我認爲如果你的意思是不匹配方括號中的字符,那麼「^」必須是[]中的第一個字符。