假设您想在适用时删除外部双引号(如果您不这样做,只需更改第一个捕获组以也包含引号),类似的事情应该可以解决问题:
public class Demo {
private static final Pattern WORD =
Pattern.compile("\"((?:[^\\\\\"]|\\\\.)*)\"|([^\\s\"]+)");
public static void main(String[] args) {
String cmd =
"command " +
"\"string with blanks\" " +
"\"anotherStringBetweenQuotes\" " +
"\"a string with \\\"escaped\\\" quotes\" " +
"stringWithoutBlanks";
Matcher matcher = WORD.matcher(cmd);
while (matcher.find()) {
String capturedGroup = matcher.group(1) != null ? matcher.group(1) : matcher.group(2);
System.out.println("Matched: " + capturedGroup);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
public class Demo {
private static final Pattern WORD =
Pattern.compile("\"((?:[^\\\\\"]|\\\\.)*)\"|([^\\s\"]+)");
public static void main(String[] args) {
String cmd =
"command " +
"\"string with blanks\" " +
"\"anotherStringBetweenQuotes\" " +
"\"a string with \\\"escaped\\\" quotes\" " +
"stringWithoutBlanks";
Matcher matcher = WORD.matcher(cmd);
while (matcher.find()) {
String capturedGroup = matcher.group(1) != null ? matcher.group(1) : matcher.group(2);
System.out.println("Matched: " + capturedGroup);
}
}
}
Run Code Online (Sandbox Code Playgroud)
正则表达式有点复杂,因此值得对其进行一些解释:
[^\\\\\"]匹配除反斜杠或双引号之外的所有内容\\\\.匹配反斜杠后跟任意字符(包括双引号),即转义字符(?:[^\\\\\"]|\\\\.)*匹配任何转义或非转义字符序列,但不捕获该组(因为(?:))"\"((?:[^\\\\\"]|\\\\.)*)\"匹配任何包含在双引号中的此类序列并捕获引号内部([^\\s\"]+)匹配任何非空字符的非空序列,并将其捕获在一个组中| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |