有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

仅当同时统计了负前瞻和负前瞻时,才使用java拆分字符串

您好,我来到了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,但我无法对这个特定案例进行反向工程。这可能吗


共 (1) 个答案

  1. # 1 楼答案

    你可以用

    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