分三個階段進行。
- 拆分爲
;
以分開陳述。
- 拆分鍵/值對
=
。
- 處理價值的報價。
這是一個基本的例子。
def get_value(line)
# Split into statements
statements = line.split(/\s*;\s*/)
# Extract the value of the 2nd statement
_,value = statements[1].split(/\s*=\s*/)
# Strip the quotes
value.gsub!(/^(['"]?)(.*)\1$/, '\2')
return value
end
有幾個邊緣情況下無法處理:如果您感興趣的語句不是第二個呢?但是這可以根據需要進行修正。在多個步驟中完成分析,而不是嘗試將其塞進一個正則表達式中會更容易。
例如,這可以正確處理嵌入式和轉義引號,如%q[inline; filename="name's.extension"]
和%q[inline; filename="name's.\\"extension\\""]
。
如果你真的想把它作爲一個單一的正則表達式,好的,你問它。
re =/
\bfilename
\s*=\s*
(?:
(?<quote>['"])(?<value>.*)\k<quote> |
(?<value>[^;]+)
)
/x
return re.match(line)['value']
,其將擴展的處理分成兩個選擇:一個帶引號的,一個沒有。否則filename=name.ext;
會拿起分號,我找不到另一種方法來阻止它,不會引入新的問題。
例如,/\bfilename\s*=\s*(?<quote>['"]?)(?<value>.*?)\k<quote>;?$/
將對測試數據起作用,但如果在分號之後有任何東西,例如%q[inline; filename='name.extension'; foo]
,它將會失敗。
你問了專家的正則表達式知識。作爲正則表達式專家的一部分是知道你什麼時候不應該使用正則表達式。這應該可以用語法來處理,否則你會不斷追逐邊緣案例。
到目前爲止,沒有任何答案可以識別不平衡的報價,例如之前的單一報價和之後的報價。您是否希望該方法確認報價是否平衡? –
其實,這將是蛋糕上的櫻桃:-) – Whyves
在某個時刻,你需要一個語法。 – Schwern