正则表达式组匹配报价的时候,我不希望它

问题描述:

我有这样的正则表达式:正则表达式组匹配报价的时候,我不希望它

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

Regular expression visualization

Debuggex Demo

但问题是,当我有一个像输入"foo",我使用匹配器通过组,发现它的第一个组是"foo",当我希望它是foo。我究竟做错了什么?

编辑:

我使用Java和我只是固定它

"((?:[^"\\]|\\.)*)"|(\S+) 

Regular expression visualization

Debuggex Demo

第一个捕获组不包括*这是整个字符串。我把它放在一个捕获小组内,并使其内部的一个非捕获小组。

编辑:其实没有...它的工作在网上正则表达式调试器而不是在我的计划......

+0

第一组长度为1个字符,不允许使用''',所以它不可能匹配类似'“foo”'的东西,而第二组('\ S +')可以匹配'“ foo“',但不应该在这里触发,你使用的是什么语言?你能提供一段代码来显示问题吗? –

+0

捕获双引号文字的内容,如果它匹配,就抓住它。模式:'“([^”\\] *(?:\\。[^ \\“] *)*)”|(\ S +)' –

+0

我会用[([^“\ s] \ S *)'而不是'(\ S +)'来避免含糊不清。“'foo”'后面会出现什么?它可能不是空白? – rici

夺双引号的文字模式的内容(科1),如果匹配的抓住它。

另外,还要考虑展开模式:

 "([^"\\]*(?:\\.[^\\"]*)*)"|(\S+) 

在Java:

String pat = "\"([^\"\\\\]*(?:\\\\.[^\\\\\"]*)*)\"|(\\S+)"; 

注意,像(A|B)*模式往往导致Java中的堆栈溢出的问题,这就是为什么已展开的版本是优选的。