【发布时间】:2017-10-10 09:06:58
【问题描述】:
我要解析以下字符串:
String text = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\"";
// "w1 w"2" w3 | w4 w"5 "w6 w7"
我正在使用Pattern.compile(regex).matcher(text),所以我在这里缺少的是正确的正则表达式。
规则是正则表达式必须:
- 隔离任何单个单词
- 任何用双引号括起来的子字符串都是匹配的
- 必须忽略单词中的双引号(稍后我将用空格替换它们)。
所以结果匹配应该是:
- w1 w"2
- w3
- |
- w4
- w"5
- w6 w7
双引号是否包含在双引号包围的子字符串中是无关紧要的(例如 1. 可以是 w1 w"2 或 "w1 w"2")。
我想出的是这样的:
"\"(.*)\"|(\\S+)"
我还尝试了上述正则表达式的许多不同变体(包括后向/前向),但没有一个能够给我预期的结果。
关于如何改进这一点的任何想法?
【问题讨论】:
-
如何让一个被
" "覆盖的字符串包含多个"s?会不会直接把w1 w当成一个词,而不是w1 w"2? -
也许我误解了你的问题,但我认为你在这里可能有一个矛盾的要求:“必须忽略单词中的双引号”。 Java 正则表达式中的一个词被定义为
[A-Za-z0-9_](参见en.wikipedia.org/wiki/Regular_expression#Character_classes),所以你不能在一个词中包含"... -
试试
String pat = "\"[^\"]*(?:\\b\"\\b[^\"]*)*\"|\\S+"; -
@procrastinator; @anothernode:您对Java正则表达式领域中单词的严格定义是正确的,我在这里的意思是单词被'“'分成两部分,它仍然应该被视为一个单一的(让我通过定义)......单词.