簡體   English   中英

PCRE 正則表達式的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM