2010-04-27 143 views
1

我在創建正則表達式時遇到了一些問題。使用正則表達式在引號之間獲取文本

我需要一個正則表達式來匹配下面的例子,然後分賽第一引號的字符串:

輸入字符串

("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ')

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', 'arg1', "arg2")

必然選擇子匹配

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

正則表達式到目前爲止:

\((["'])([^"']+)\1,?.*\)

正則表達式確實在第一組引號之間的文本子匹配,並返回顯示子匹配以上。

這幾乎是可以正常使用,但我的問題是,如果引用的字符串包含在子比賽停止在一審文本報價,請看下圖:

如果不輸入字符串

("Lorem ipsum dolor \"sit\" amet, consectetur adipiscing elit.")

只有子場比賽:Lorem ipsum dolor

("Lorem ipsum dolor 'sit' amet, consectetur adipiscing elit.")

整場比賽失敗。

注意

輸入字符串實際上是PHP代碼的函數調用。我正在編寫一個腳本,它將掃描特定功能的.php源文件,並從第一個參數中獲取文本。

+0

爲什麼不是僅僅指剛使用反射API?編輯:沒關係...你的意思是你掃描實際的腳本不是功能/類/等.. – prodigitalson 2010-04-27 17:11:00

+0

正確。我正在掃描來源尋找上面的字符串。 – Camsoft 2010-04-27 20:00:51

回答

6

試試這個正則表達式:

\(\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')(?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*\s*\) 

一些解釋:

  • \(\s\*匹配左括號和右離子空白。
  • (?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')用於匹配任何帶引號的字符串,只允許在引用\時轉義字符。
  • (?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*描述了零個或多個引號字符串,前面有一個,,前面和後面可以帶有空格。
  • \s*\)與可選空白右括號匹配。
+0

無法完全實現此功能。我在第46位遇到失蹤paren錯誤? – Camsoft 2010-04-27 20:23:02

+0

@Camsoft:修正了這個問題。 – Gumbo 2010-04-27 21:08:02

0

確保不匹配報價,當它被轉義(面前有一個反斜槓):

/\((["'])([^"']+)[^\\]\1,?.*?\)/ 
相關問題