【问题标题】:Split string only if BOTH the negative lookahead and negative lookbehind are statisfied仅当负前瞻和负后瞻都满足时才拆分字符串
【发布时间】:2019-06-14 14:26:17
【问题描述】:

你好,我来到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+

我希望以这样一种方式组合这两个语句介于两者之间。我在这个主题上找到了另一个question,但我无法针对这种特殊情况对其进行逆向工程。这可能吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    你可以使用

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

    regex demo

    详情

    • (?&lt;=\d)\s+(?=[a-zA-Z]) - 1+ 个空格,左边有一个数字,右边有一个字母
    • | - 或
    • (?&lt;=[a-zA-Z])\s+(?=\d) - 1+ 个空格,左边有一个字母,右边有一个数字
    • | - 或
    • (?&lt;=\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
    

    【讨论】:

    • 哇,你真快。感谢您添加详细信息和解释。
    • 如果我也想拆分 14,642 和 10,528。是添加另一个最有效的方法|条款?例如:(?&lt;=\d)\s+(?=[a-zA-Z])|(?&lt;=[a-zA-Z])\s+(?=\d)|(?&lt;=\d)\s+(?=\d)
    • @StephanHogenboom 添加|(?&lt;=\d)\s+(?=\d),是的。
    • 有双 \\ 来逃避 Java 中的 \ 吗?
    • @MacGyver Java 字符串文字支持字符串转义序列,例如\n 用于换行符,或\r 用于回车字符,因此需要\\ 来键入文字反斜杠,并且文字反斜杠是正则表达式转义字符。
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    相关资源
    最近更新 更多