正则表达式拆分除指定子字符串外的字符串
Regex to split string except specified substring
我目前正在尝试通过 Java 中的空格拆分字符串,除了第一个和最后一个双引号之间的所有内容(这是一个特定的情况,它们保证存在)。我是正则表达式的新手,但这是我在第一个和最后一个引号中找到子字符串的方法:
regex = ((?<=\").*(?=\"))
我已经在 https://regex101.com 上测试过了,对结果很满意。
但是现在当我尝试像下面这样拆分我的输入字符串时:
String input = "apple \"banana\"";
String[] arr = input.split("\s+((?<=\").*(?=\"))");
它没有做真正的分裂。
这是预期的输出:
arr[0] == "apple", arr[1] == "banana"
我收到的输出:
arr[0] == "apple \"banana\""
我在这里错过了什么?任何指导将不胜感激。
编辑:@WiktorStribiżew 在评论中给出了答案。
非常感谢所有提供帮助的人,尤其是@WiktorStribiżew
干杯!
您应该匹配这些字符串,这是一个可能的解决方案:
String input = "apple \"banana\"";
Pattern p = Pattern.compile("\"([^\"]*)\"|\S+");
Matcher m = p.matcher(input);
List<String> results = new ArrayList<>(); // Declare a list
while (m.find()) {
if (m.group(1) != null) {
results.add(m.group(1)); // Add Group 1 to the list
} else {
results.add(m.group()); // Add the whole match value to the list
}
}
System.out.println(results); // Prints the resulting list
注意:如果您打算匹配第一个匹配的 "
到最后一个 "
之间的所有字符,您可以使用 Pattern p = Pattern.compile("\"(.*)\"|\S+");
.
输出:
apple
banana
"([^"]*)"|\S+
模式 matches:
"
- 一个 "
字符
([^"]*)
- 第 1 组:除 "
之外的任意 0 个或更多字符
"
- 一个 "
字符
|
- 或
\S+
- 1+ 个非空白字符。
"\s*\"++|\s++"
苹果“香蕉”' => 2 [[苹果,香蕉]]
我目前正在尝试通过 Java 中的空格拆分字符串,除了第一个和最后一个双引号之间的所有内容(这是一个特定的情况,它们保证存在)。我是正则表达式的新手,但这是我在第一个和最后一个引号中找到子字符串的方法:
regex = ((?<=\").*(?=\"))
我已经在 https://regex101.com 上测试过了,对结果很满意。 但是现在当我尝试像下面这样拆分我的输入字符串时:
String input = "apple \"banana\"";
String[] arr = input.split("\s+((?<=\").*(?=\"))");
它没有做真正的分裂。 这是预期的输出:
arr[0] == "apple", arr[1] == "banana"
我收到的输出:
arr[0] == "apple \"banana\""
我在这里错过了什么?任何指导将不胜感激。
编辑:@WiktorStribiżew 在评论中给出了答案。
非常感谢所有提供帮助的人,尤其是@WiktorStribiżew 干杯!
您应该匹配这些字符串,这是一个可能的解决方案:
String input = "apple \"banana\"";
Pattern p = Pattern.compile("\"([^\"]*)\"|\S+");
Matcher m = p.matcher(input);
List<String> results = new ArrayList<>(); // Declare a list
while (m.find()) {
if (m.group(1) != null) {
results.add(m.group(1)); // Add Group 1 to the list
} else {
results.add(m.group()); // Add the whole match value to the list
}
}
System.out.println(results); // Prints the resulting list
注意:如果您打算匹配第一个匹配的 "
到最后一个 "
之间的所有字符,您可以使用 Pattern p = Pattern.compile("\"(.*)\"|\S+");
.
输出:
apple
banana
"([^"]*)"|\S+
模式 matches:
"
- 一个"
字符([^"]*)
- 第 1 组:除"
之外的任意 0 个或更多字符
"
- 一个"
字符|
- 或\S+
- 1+ 个非空白字符。
"\s*\"++|\s++"
苹果“香蕉”' => 2 [[苹果,香蕉]]