可选引号的正则表达式,哈希数组和空字符串

时间:2014-07-24 23:21:30

标签: ruby regex string

我想写一个正则表达式来接受ruby中的以下类型 -

1)“value1”

2)'value2'

3)“”或''

4)[{:this => :那个,“那个”=> :this},{'foo'=> :bar},{:bar => '富'}]

到目前为止,我有以下内容 -

regex = /(["']?)([^'"].*?[^'"])\1/

问题在于它不接受空字符串 - “”和“”。

你能建议任何替代或改进吗?

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*)
  \]
)

我会让你进一步根据自己的需要调整它。