我想写一个正则表达式来接受ruby中的以下类型 -
1)“value1”
2)'value2'
3)“”或''
4)[{:this => :那个,“那个”=> :this},{'foo'=> :bar},{:bar => '富'}]
到目前为止,我有以下内容 -
regex = /(["']?)([^'"].*?[^'"])\1/
问题在于它不接受空字符串 - “”和“”。
你能建议任何替代或改进吗?
答案 0 :(得分:1)
我不知道ruby使用什么样的正则表达式,但假设它与Perl兼容:
regex = /(["'])(?:\\.|.)*?\1/
演示:http://regex101.com/r/iP8hY8/1
此表达式允许您转义字符串"like \" that"
中的引号。
这里的诀窍是使用替代方法,使替代方法的第二部分(.
)永远不能匹配反斜杠。非贪心量词确保反向引用首先匹配结束引用。
编辑:实际上,我认为我误解了你问题的第四点。
如果你想让正则表达式匹配值数组,你必须创建更多...... 类似于解析器的,如下所示:
(?<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*)
\]
)
我会让你进一步根据自己的需要调整它。