仅在同时规定了负向前瞻和负向后瞻的情况下才拆分字符串

时间:2019-06-14 14:26:17

标签: 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序列(无,一个或多个空格分开)被视为元素。

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

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

和带有负面印象的部分。

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

我希望以这样的方式合并两个语句,即如果空格序列前后的两个部分均为字母,那么它只会不匹配,因此您可以将多个单词链接在一起而不拆分在两者之间。我找到了与此主题有关的另一个question,但是对于这种特殊情况,我无法对其进行反向工程。这可能吗?

1 个答案:

答案 0 :(得分:5)

您可以使用

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