java - 仅当负前瞻和负后瞻都满足时才拆分字符串

标签 java regex

你好,我来了 this question作者想要转换字符串的地方:

exampleString =  "2 Marine Cargo       14,642 10,528  Denver Factory North     16,016 more text 8,609 argA 2,106 argB"

进入一个类似于这样的数组/列表:

String[] resultArray = {"2", "Marine Cargo", "14,642", "10,528", "Denver Factory North", "16,016",
                "more text", "8,609", "argA", "2,106", "argB"};

因此数字部分(带或不带逗号)被视为元素
纯 alpha 序列(不除、不除一个或多个空格)被视为一个元素。

这可以通过匹配组来完成
或者通过在字符串的前一部分和下一部分都不是字母序列的空格上进行分割。我很好奇后者是否可能。 我认为部分应该以消极的眼光来完成:

\s+(?![A-Za-z]+)

并以消极的眼光看待后面的部分。

(?<![a-zA-Z])\s+

我希望以这样的方式组合这两个语句,只有当空格序列之前和之后的部分都是 alpha 时,它才匹配,这样您就可以将多个单词链接在一起而无需拆分之间。我找到了另一个question关于这个主题,但我无法针对这个特殊情况对其进行逆向工程。这可能吗?

最佳答案

您可以使用

String[] results = exampleString.split("(?<=\\d)\\s+(?=[a-zA-Z])|(?<=[a-zA-Z])\\s+(?=\\d)|(?<=\\d)\\s+(?=\\d)");

请参阅regex demo

详细信息

  • (?<=\d)\s+(?=[a-zA-Z]) - 1+ 个空格,左侧有一个数字,右侧有一个字母
  • | - 或
  • (?<=[a-zA-Z])\s+(?=\d) - 1+ 个空格,左侧有一个字母,右侧有一个数字
  • | - 或
  • (?<=\d)\s+(?=\d) - 1+ 个空格,左侧各有一个数字,右侧各有一个数字。

Java demo :

String exampleString =  "2 Marine Cargo       14,642 10,528  Denver Factory North     16,016 more text 8,609 argA 2,106 argB";
String results[] = exampleString.split("(?<=\\d)\\s+(?=[a-zA-Z])|(?<=[a-zA-Z])\\s+(?=\\d)|(?<=\\d)\\s+(?=\\d)");
for (String s: results) {
    System.out.println(s);
}

输出:

2
Marine Cargo
14,642
10,528
Denver Factory North
16,016
more text
8,609
argA
2,106
argB

关于java - 仅当负前瞻和负后瞻都满足时才拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56600148/

相关文章:

python - 如何使用 python 捕获正则表达式匹配后的 5 行

regex - 需要自动确定将导致正则表达式匹配的文本

javascript - 从字符串中获取数字(十进制数字)

java - 如何替换命名组的值

Java 泛型 : Casting a raw type to any reifiable type doesn't generate unchecked cast warning

java - Java中子类可以继承哪些方法?

java - 单击按钮时切换 TextView 背景

java - 如何使用 Java 中的 stringreader 获取字符串中的下一个字符?

java - 服务器和 JRE 设置为 TLS 1.2,但 Coldfusion 9 仍尝试使用 TLS 1.0

c++ - 解析字符串的正则表达式模式