我想解析以下字符串:
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)
,所以我在这里缺少的是正确的正则表达式。
规则是正则表达式必须:
所以得到的匹配应该是:
双引号包含子串中是否包含双引号是无关紧要的(例如1.可以是 w1 w“2 或”w1 w“2”)。
我想出的是这样的事情:
"\"(.*)\"|(\\S+)"
我还尝试了上述正则表达式的许多不同变体(包括lookbehind / forward),但没有一个能给我预期的结果。
有关如何改善这一点的想法吗?
答案 0 :(得分:1)
这似乎可以完成这项工作:
"(?:[^"]|\b"\b)+"|\S+
请注意,在Java中,因为我们使用字符串文字作为正则表达式,所以反斜杠需要在另一个反斜杠之后:
String regex = "\"(?:[^\"]|\\b\"\\b)+\"|\\S+";
答案 1 :(得分:1)
试试这个正则表达式:
(?:(?<=^")|(?<=\s")).*?(?="(?:\s|$))|(?![\s"])\S+
<强>说明强>
(?:(?<=^")|(?<=\s"))
- 正面Lookbehind找到"
之前的位置。此"
要么位于字符串的开头,要么位于空格.*?
- 匹配除了换行符之外的任何字符的0次出现(?="(?:\s|$))
- 用于验证到目前为止匹配的内容后面是空格或匹配后没有任何内容($
)的正面预测。|
- 或(上述匹配或以下内容)(?![\s"])
- 用于验证未在空格或"
\S+
- 匹配1个以上的非空格字符Java代码(Generated from here):
Run code here to see the output
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MyClass {
public static void main(String args[]) {
final String regex = "(?:(?<=^\")|(?<=\\s\")).*?(?=\"(?:\\s|$))|(?![\\s\"])\\S+";
final String string = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\"";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
<强>输出:强>