[英]Problem with a PCRE regexp
我正在嘗試創建一個可以匹配這個的正則表達式:
argument ::= define_scope [';' define_scope]*
define_scope ::= (['local'] | 'global') define_var
define_var ::= variable_name expression
variable_name ::= Name
所以,像local varName something;;world foo bar;;local foobar bar
類的東西。
我試過:
((^|;;)?(local|world) (.+?) (.+?))+
但是如果我在前面的例子中使用它,我會得到這些匹配:
local varName s
;;world foo b
;;local foobar b
所以它只需要每個匹配的最后一個單詞的第一個字母。
如果我從最后一個組中刪除惰性匹配,它只匹配:
local varName something;;world foo bar;;local foobar bar
所以最后一組是something;;world foo bar;;local foobar bar
。
一些想法來解決這個問題?
這不是常規語法,因此無法使用正則表達式解析生成的句子/單詞(cs speak)。 這是一個上下文無關的語法,你需要一個使用遞歸下降(LL-parser)的解析器。
正則表達式不是您工具箱中的萬能工具,它們在這里還不夠,但是可以通過告訴它匹配(但不包括)分號,並刪除非貪婪?
:
/(^|;;)((local|world) (.+?) ([^;]+))/
你的問題是.
匹配任何字符。 匹配.
貪婪地在第一場比賽中吃掉了字符串的 rest,而非貪婪地滿足於第一個字符。 解決方案是告訴它貪婪地匹配除分號以外的所有內容,與[^;]+
。 理想情況下,您應該將其限制為您實際希望出現在那里的字符列表,而不是使用.
如此自由。
那是我需要的正則表達式:
((?:(local|world) )?(.*?)(?: (.+?))(?:(?<!;);(?!;)|$))+?
這個可以毫無問題地解析任何具有的東西;; 不匹配
總之謝謝大家。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.