2011-07-20 133 views
1

我試圖創建一個正則表達式可以匹配這個:問題與PCRE正則表達式

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

一些想法來解決這個問題?

+1

請看看Markdown的幫助:http://stackoverflow.com/editing-help – sidyll

回答

1

這是我所需要的正則表達式:

((?:(local|world))?(.*?)(?: (.+?))(?:(?<!;);(?!;)|$))+? 

這一次可以在沒有任何問題的解析有;;沒有匹配它

無論如何感謝所有。

2

這不是一個正規的語法,所得的句子/單詞(CS說)不能用正則表達式解析。它是一種上下文無關語法,您需要一個使用遞歸下降(LL-parser)的解析器。

+0

不正確,請參閱我的回答。 – Steve81

1

正則表達式並不是工具箱中的全部最終工具,它們在這裏不夠用,但可以通過告訴它與(但)不包括)分號,除去非貪婪?

/(^|;;)((local|world) (.+?) ([^;]+))/ 

你的問題是.匹配任何字符。匹配.貪婪地在第一場比賽中吃掉了剩餘的繩子,而非貪婪地對第一個人物感到滿意。解決辦法是告訴它貪婪地匹配除了分號以外的所有東西,用[^;]+。理想情況下,您應該將此限制爲您實際希望顯示的字符列表,而不是如此自由地使用.

+0

不正確,請參閱我的回答。 – Steve81