2011-06-18 53 views
1

我想構建一個解析器,能夠使用正則表達式提取數據。使用可選的反向引用來捕獲字符串可選的引號括起來

我希望能夠匹配

這是我現在所擁有的:

(\w+)\s+('|")([^\2\\]*(\\.[^\2\\]*)*)\2\s*; 

([^\2\\]*(\\.[^\2\\]*)*)部分從http://ad.hominem.org/log/2005/05/quoted_strings.php

採取不幸的是,我有兩個問題,這種模式。

首先,我希望能夠捕獲不包含單/雙引號的字符串。

print "hello world";作品,但print foobar;不起作用。最後,我還沒有能夠使反向引用\2可選。此外,我不知道是否只是我附上正則表達式的方式,但我似乎無法解析此模式的多個實例。

如果我嘗試使用print 'hello'; print 'foobar';的正則表達式,它只會返回第一個print 'hello';部分。

在此先感謝您的幫助。

編輯

這裏是什麼,我試圖解析一個片段:

listen   80; 
server_name  domain.com *.domain.com; 
rewrite^  http://www.domain.com$request_uri? permanent; 

我想捕捉它們的參數的每一個動作。基本上我wan't能夠解析NGINX配置文件:http://wiki.nginx.org/FullExample

+0

你想匹配什麼? – Halcyon

+0

你的目標是解析一個PHP字符串嗎? –

+1

這是一個瘋狂的猜測,但是你不能只是把'('|「)'改成'('|」|)'? – Halcyon

回答

2

反向引用doesn't work這樣的字符類別[^\2]。它可能是一個多字符字符串,不能在那裏使用。你可以使用((?!\2).)*構造來解決這個問題。但是如果你簡化了你的匹配模式,那真的會更簡單。

最簡單的方法在這裏是單獨列出的三種可能的選擇:

/(\w+)\s+ (?: '([^']*)' | "([^"]*)" | (\S+)) \s*;/x 

很明顯,你將不得不來從結果集的結果[2],[3]或[4]手動。

+0

這很好。謝謝!我真的沒有太多的正則表達式的經驗,這是我第一次接觸反向引用。 – Caissy

1

如果你想匹配多次使用preg_match_all來代替。只要匹配的字符串不重疊,您就可以獲得所有這些字符串。

+0

不,它似乎沒有正常工作。 – Caissy

+0

你可以發佈你的腳本嗎? – Halcyon

+0

還沒有任何腳本。 – Caissy

相關問題