[英]Regex for optional quotes, array of hashes and empty string
我想編寫一個正則表達式以在ruby中接受以下類型-
1)“ value1”
2)'value2'
3)“”或“
4)[{:this =>:that,“ that” =>:this},{'foo'=>:bar},{:bar =>'foo'}]
到目前為止,我有以下內容-
regex = /(["']?)([^'"].*?[^'"])\1/
這樣做的問題是它不接受空字符串“”和“”。
您可以提出任何替代或改進建議嗎?
我不知道正則表達式紅寶石使用什么,但是假設它與Perl兼容:
regex = /(["'])(?:\\.|.)*?\1/
演示: http : //regex101.com/r/iP8hY8/1
該表達式將使您可以對字符串"like \\" that"
引號進行轉義。
這里的訣竅是使用替代方式,使替代方式的第二部分( .
)永遠無法匹配反斜杠。 非貪婪量詞可確保反向引用首先匹配結尾的引用。
編輯:實際上,我認為我誤解了您問題中的第四點。
如果您希望正則表達式匹配值數組,則必須創建更多... parser-like ,如下所示:
(?<value>
(?<string>(?<quote>["'])(?:\\.|.)*?\k<quote>|:\w+)
|
(?<hash>\{
(?:(?:(?<hashitem>\s*\g<string>\s*=>\s*\g<value>\s*),\s*)*\g<hashitem>
|\s*)
\})
|
\[
(?:(?:\s*\g<value>\s*,\s*)*\g<value>
|\s*)
\]
)
演示: http : //regex101.com/r/iP8hY8/2
這個表達式實際上也會處理字符串數組。 請注意,我沒有為數字添加任何內容,因為您沒有提及它們。
如果您只想只匹配哈希數組,則可以對上面的表達式進行一些調整:
(?<value>
(?<string>(?<quote>["'])(?:\\.|.)*?\k<quote>|:\w+)
|
(?<hash>\{
(?:(?:(?<hashitem>\s*\g<string>\s*=>\s*\g<value>\s*),\s*)*\g<hashitem>
|\s*)
\})
|
\[
(?:(?:\s*\g<hash>\s*,\s*)*\g<hash>
|\s*)
\]
)
我會讓您進一步調整以適應您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.