有没有办法在两个双引号内匹配双引号?

时间:2015-12-25 22:02:48

标签: ruby regex

我尝试了以下正则表达式,但它匹配所有双引号:

(?>(?<=(")|))"(?(1)(?!"))

以下是文字示例:

"[\"my cars last night\",
\"Burger\",\"Decaf\" shirt\",
\"Mocha\",\"marshmallows\",
\"Coffee Mission\"]"

我想要匹配的模式是line 2

中双引号之间的双引号

2 个答案:

答案 0 :(得分:4)

作为一般规则,我会说:

给出一个字符串:

\"Burger\" \"Decaf\" shirt\"

您如何确定哪个\"是多余的(不匹配)?这是Burger之后,Decaf之后还是shirt之后的一次?或者在这些话之前?我相信这个选择是随意的。

虽然在您的特定示例中,您似乎希望所有\"与逗号不相邻。

可以通过以下regexp找到:

(?<!^)(?<![,\[])\\"(?![,\]])

我们从中心开始\\"(反斜杠后跟双引号)。

然后我们使用否定前瞻来丢弃所有后跟逗号或右方括号的匹配。

然后我们使用负向lookbehind来丢弃逗号或开括号之后发生的所有匹配。

我使用的Regexp引擎无法应对环境声明中的交替。为了解决这个问题,我利用了lookarounds是零长度匹配的事实,并且我预先设置了负面的lookbehind,它匹配表达式开头的行首。

证明(在perl中):

$ cat test
"[\"my cars last night\",
\"Burger\",\"Decaf\" shirt\",
\"Mocha\",\"marshmallows\",
\"Coffee Mission\"]"
$ perl -n -e '$_ =~ s/(?<!^)(?<![,\[])\\"(?![,\]])/|||/g; print $_' test
"[\"my cars last night\",
\"Burger\",\"Decaf||| shirt\",
\"Mocha\",\"marshmallows\",
\"Coffee Mission\"]"

答案 1 :(得分:1)

我们假设您的字符串格式必须如下:

["item1", "item2", ... "itemN"]

知道双引号是否为结束双引号的方法是检查它后面是逗号还是结束方括号。 要查找用双引号括起来的双引号,您必须匹配从开头到所有格式正确的项目,直到出现意外报价。

查找第一个封闭引号的示例(如果存在):

(?:"[^"]*",\s*)*+"[^"]*\K"

demo

但是这只适用于所有字符串中的一个封闭引号,如果你想找到所有字符串,它们就无用了。

找到所有引号:

(?:\G(?!\A)|(?:\A[^"]*|[^"]*",\s*)(?:"[^"]*",\s*)*+")[^"]*\K"(?!\s*[\],])

demo