8

我需要找到一个用双引号括起来的子字符串,例如,like"test""te\"st"""但不是"""“\”。为了实现这一点,这是以下最佳方式

1) /".*"/g
2) /"[^"\\]*(?:\\[\S\s][^"\\]*)*"/g
3) /"(?:\\?[\S\s])*?"/g
4) /"([^"\\]*("|\\[\S\s]))+/g

昨天在面试的时候被问到这个问题,想知道答案以备日后参考。

4

3 回答 3

2

这些表达式的计算如下:

表达式 1 匹配:

  • 一个反逗号
  • 贪婪地使用任何字符,包括反逗号或斜线
  • 最后一个逗号。

这将匹配"test" some wrong text "text",因此失败

表达式 2 匹配:

  • 一个反逗号
  • 贪婪地尽可能多的字符既不是反逗号也不是斜杠
  • 贪多套
    • 任何以斜线开头的字符
    • 贪婪地尽可能多的字符既不是反逗号也不是斜杠
  • 最后一个逗号

因此,这会将反逗号中的所有字符收集在集合中,并用斜线分隔。如果逗号前面有斜线,则它特别排除了逗号,将其包含在任何后续集合中。这将起作用。

表达式 3 匹配:

  • 一个反逗号
  • 尽可能少的套装:
    • 前面有可选斜杠的任何一个字符
  • 最后一个逗号

这收集了所有字符,可选地以斜线开头,但不是贪婪的。这将起作用

表达式 4 匹配:

  • 一个反逗号
  • 贪婪地所有既不是逗号也不是斜杠的字符
  • 一项或多项:
    • 一个反逗号或
    • 斜线和任何字符

这将匹配"test"\x,因此失败

结论:

据我所知,表达式 2 和 3 都可以。我可能遗漏了一些东西,但对于给出的示例,两者肯定会起作用(或不合适)。那么问题来了,哪个更好。我会投票给三个,因为它更简单。

于 2013-03-14T09:15:23.800 回答
0

你的语法有点不清楚。我假设你想找到所有格式为 DQ [除了 DQ 或 \DQ]* DQ 的字符串。

正则表达式/"([^"\\\\]|\\\\"|\\\\[^"])*"/g

于 2013-03-14T08:56:13.153 回答
0

你也可以摆脱这个更简单的家伙:

/("(\\"|[^"])+")/g

http://jsfiddle.net/b9chris/eMN2S/

于 2013-04-07T23:41:59.373 回答