正则表达式:要求在字符串中转义引号

时间:2012-01-05 17:10:09

标签: regex

感谢您的光临,

我有一段非常糟糕的时间试图为这个正则表达式问题找到正确的搜索条件。我需要确保引号已经在字符串中转义,否则匹配应该失败。 (这类问题的大多数搜索结果只是说你需要逃避引号或如何逃避引号的页面。)

有效:

This is valid
This \"is Valid
This is al\"so Valid\"

无效:

This i"s invalid
This i"s inv"alid

到目前为止,我唯一能找到的是

((?:\\"|[^"])*)

这似乎与以下的第一部分匹配,但在转义引用之后没有任何内容

This is a \"test

同样,这应该失败:

This is a \"test of " the emergency broadcast system

感谢您的帮助,我希望这是可能的。

5 个答案:

答案 0 :(得分:6)

在C#中,这似乎可以正常工作:

string pattern = "^([^\"\\\\]*(\\\\.)?)*$";

剥离逃跑离开你:

^([^"\\]*(\\.)?)*$

大致转换为:字符串开头,(多字符 - 排除 - 引用 - 或反斜杠,可选 - 反斜杠 - 任意) - 重复,字符串结束

它是字符串的开头和字符串结束标记,它强制匹配整个文本。

答案 1 :(得分:2)

不知道你使用的语言,但我会这样做:

制作一个正则表达式,匹配没有反斜杠的引用,这将在

上失败
This is a \"test

并成功

This is a \"test of " the emergency broadcast system

例如这一个:

.*(?<!\\)".*

然后将结果使用否定表达式。 希望这会对你有所帮助

我在java中的测试看起来像

    String pat = ".*(?<!\\\\)\".*";
    String s = "This is a \\\"test";
    System.out.println(!s.matches(pat));
    s = "This is a \\\"test of \" the emergency broadcast system";
    System.out.println(!s.matches(pat));

答案 2 :(得分:2)

你想使用负面的背后隐藏。

(?<!\\)"

此正则表达式将匹配所有不带单个斜杠的引号。

如果针对您的示例字符串运行此正则表达式并且它找到1个或多个匹配项,则该字符串无效。

答案 3 :(得分:1)

除了反斜杠和引号,或反斜杠和下一个字符外,你需要采取一切。

([^\\"]|\\.)*

这样,这将失败:

ab\\"c

这将成功:

ab\\\"c

这将成功:

ab\"c

答案 4 :(得分:1)

您正在寻找的RegEx是:

/^(?:[^"]*(?:(?<=\\\)"|))*$/

说明: [^"]*将匹配输入,直到找到第一个"或达到输入结束。如果找到",请确保在(?<=\\\)"后面的{strong>始终后面跟/。上面的场景是递归重复,直到达到输入结束。

测试:请考虑使用以下PHP代码进行测试:

$arr=array('This is valid',
'This \"is Valid',
'This is al\"so Valid\"',
'This i"s invalid',
'This i"s inv"alid',
'This is a \"test',
'This is a \"test of " the emergency broadcast system - invalid');
foreach ($arr as $a) {
   echo "$a => ";
   if (preg_match('/^(?:[^"]*(?:(?<=\\\)"|))*$/', $a, $m))
      echo "matched [$m[0]]\n";
   else
      echo "didn't match\n";
}

<强>输出:

This is valid => matched [This is valid]
This \"is Valid => matched [This \"is Valid]
This is al\"so Valid\" => matched [This is al\"so Valid\"]
This i"s invalid => didn't match
This i"s inv"alid => didn't match
This is a \"test => matched [This is a \"test]
This is a \"test of " the emergency broadcast system - invalid => didn't match