例如,假設我想匹配一個大寫字母A-Z
,但不是F-H
。如果我沒有弄錯,大寫字母將是[A-Z]
,而不是F-H
將是[^F-H]
。直覺上,我希望它是[A-Z^F-H]
,但似乎沒有工作。我知道它可以完成[A-EI-Z]
,但我正在尋找更少的解決方法。編輯:尋找更一般的解決方案。如何匹配一組中的字符,但不匹配第一組中的字符?
回答
沒有什麼是「少了解決方法」。字符範圍語法(如[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的關鍵在於它們實際上並不消耗任何輸入,如果在當前匹配位置不符合斷言,它們只會導致匹配失敗。它們的效率通常比直接處理效率低(如果可以的話),並且可能會非常棘手,而且不同的正則表達式引擎在可以使用和不能使用它們時似乎有不同的限制。
謝謝。我想我會嘗試使用開始條件,看看如何。看起來似乎變得混亂。 – Fred
除非最近事情發生了很大變化,否則flex沒有任何高級功能,比如lookahead或lookbehind。 –
我認爲如果你的意思是不匹配方括號中的字符,那麼「^」必須是[]中的第一個字符。
- 1. 從一組匹配的匹配的第一個字符
- 2. 僅匹配字符串中的第一組數字
- 3. 如何獲得僅匹配字符的第一個字符匹配結果
- 4. 匹配一組字
- 5. 匹配與前一組匹配的字符數量相同
- 6. 如何匹配數組中的字符串的一部分 - PHP
- 7. 匹配一個字符串與數組
- 8. 如何排除第一組的單個字符從匹配到第二組?
- 9. 數組中的Ruby匹配字符串
- 10. 如何查找有一個字符串匹配的字符串和一個字符串在Linux中不匹配
- 11. 字符串匹配組合
- 12. regEx:匹配兩組字符
- 13. 如果它是字符串的最後一個字符或下一個組不匹配,則不匹配空格?
- 14. 如何匹配匹配組的字符串以提取值?
- 15. 字符串數組匹配字符串
- 16. Regexp_substr查找字符串與一組字符不匹配
- 17. 匹配第一個字符,如果匹配刪除整行
- 18. Regexp MySQL匹配一組字符中的字
- 19. 不能在一個字符串數組中的匹配值值
- 20. 如何匹配不同的組合的字符串中的R
- 21. PHP - 匹配與數組值的字符串的第一字符和返回鍵
- 22. 在匹配組中丟棄字符
- 23. 在數組中匹配字符串php
- 24. 如何匹配TSQL中字符串的最後一個字符?
- 25. 刪除文件中匹配一個字符串但不匹配另一個字符串的行 - SED,BASH?
- 26. 匹配第一個字符在MS-DOS
- 27. 停止在第一個字符匹配?
- 28. 匹配字符串中的一個子
- 29. 在Ruby中打印匹配的字符串的第一個字
- 30. 如何匹配字符串組不包含一些子
'[A-EI-Z]'是一種「解決方法」?它似乎很清楚地描述了模式。 –
對於我提供的例子,是的,但是如果我不想要的字符在運行時才指定?有沒有辦法說「我想要任何不是_x_的大寫字母」,其中_x_可以是任何字母。 – Fred