正则表达式组匹配报价的时候,我不希望它
问题描述:
我有这样的正则表达式:正则表达式组匹配报价的时候,我不希望它
"([^"\\]|\\.)*"|(\S+)
但问题是,当我有一个像输入"foo"
,我使用匹配器通过组,发现它的第一个组是"foo"
,当我希望它是foo
。我究竟做错了什么?
编辑:
我使用Java和我只是固定它
"((?:[^"\\]|\\.)*)"|(\S+)
第一个捕获组不包括*
这是整个字符串。我把它放在一个捕获小组内,并使其内部的一个非捕获小组。
编辑:其实没有...它的工作在网上正则表达式调试器而不是在我的计划......
答
夺双引号的文字模式的内容(科1),如果匹配的抓住它。
另外,还要考虑展开模式:
"([^"\\]*(?:\\.[^\\"]*)*)"|(\S+)
在Java:
String pat = "\"([^\"\\\\]*(?:\\\\.[^\\\\\"]*)*)\"|(\\S+)";
注意,像(A|B)*
模式往往导致Java中的堆栈溢出的问题,这就是为什么已展开的版本是优选的。
第一组长度为1个字符,不允许使用''',所以它不可能匹配类似'“foo”'的东西,而第二组('\ S +')可以匹配'“ foo“',但不应该在这里触发,你使用的是什么语言?你能提供一段代码来显示问题吗? –
捕获双引号文字的内容,如果它匹配,就抓住它。模式:'“([^”\\] *(?:\\。[^ \\“] *)*)”|(\ S +)' –
我会用[([^“\ s] \ S *)'而不是'(\ S +)'来避免含糊不清。“'foo”'后面会出现什么?它可能不是空白? – rici