【问题标题】:Regex to split string except specified substring正则表达式拆分字符串,除了指定的子字符串
【发布时间】:2020-10-21 22:03:01
【问题描述】:

我目前正在尝试用 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 在 cmets 中给出了答案。

非常感谢所有提供帮助的人,尤其是@WiktorStribiżew 干杯!

【问题讨论】:

  • 你有一个匹配的正则表达式,所以匹配,而不是拆分。

标签: java regex split regex-lookarounds


【解决方案1】:

你应该匹配这些字符串,这是一个可能的解决方案:

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+");

请参阅Java demo online

输出:

apple
banana

"([^"]*)"|\S+ 模式matches

  • " - 一个 " 字符
  • ([^"]*) - 第 1 组:除 " 之外的任何 0 个或多个字符
  • " - 一个 " 字符
  • | - 或
  • \S+ - 1+ 非空白字符。

【讨论】:

  • 非常感谢您的快速回复,但我有点复杂。里面可能有更多的双引号。一个例子是“apple \"ban\"ana\"”。我想把它分成苹果和ban"ana。我尝试将模式匹配更改为 "\"(.*)\"|\\S+",但没有成功。我的目标是用空格分割,只要它们不在整个字符串的第一个和最后一个双引号之间。我可以很容易地找出这些索引,但我不知道如何使用这些信息进行拆分。有其他选择吗?
  • @MalharPandya 你的修复works
  • 不,绝对不是,您的回答完全符合问题指定的内容,我个人认为它很有用。如果你认为我忘恩负义,我很抱歉。还有一种复杂性。如果没有空格,则在最后一个双引号之后,我希望将字符包括到下一个空格(或直到字符串的末尾)。作为引用组的一部分。另外,如何将这些组存储到数组中?谢谢。
  • 编辑:我想我找到了答案,正则表达式是:"\"(.*)\"*[\"]|\\S+"。现在只需要将它存储在一个数组中. 谢谢你给我的方法@WiktorStribiżew
  • @MalharPandya 我不确定"\"(.*)\"*\"|\\S+",它似乎没有任何区别。 "\"(.*)\"|\\S+" 必须同样工作。请考虑为此共享一个测试用例。我更新了代码以将匹配的块收集到一个列表中。
【解决方案2】:
"\\s*\"++|\\s++"

苹果“香蕉”' => 2 [[苹果,香蕉]]

【讨论】:

  • 这里的正则表达式似乎也很好。我错过了什么吗?为什么这也被否决了?可能是明智的解释......还是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2013-11-19
  • 2011-06-18
相关资源
最近更新 更多