java split()的问题

riy*_*ana 3 java regex

我有一个字符串:

strArray= "-------9---------------";
Run Code Online (Sandbox Code Playgroud)

我想从字符串中找到9.字符串可能是这样的:

strArray= "---4-5-5-7-9---------------";
Run Code Online (Sandbox Code Playgroud)

现在我只想找出字符串中的数字.我需要值9,4,或者这样的东西而忽略' - '.我尝试了以下方法:

strArray= strignId.split("-");
Run Code Online (Sandbox Code Playgroud)

但是它会出错,因为有多个' - '并且我没有得到我的输出.那么java应该使用什么功能呢?

我的输入和输出应如下:

input="-------9---------------";
    output="9";
input="---4-5-5-7-9---------------";
    output="45579";
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

pol*_*nts 19

+是"一次或多次"重复的正则表达式,因此模式-+是"一个或多个破折号".这将允许您使用str.split("-+"),但您可能会得到一个空字符串作为第一个元素.

如果你只想删除所有-,那么你可以做到str = str.replace("-", "").这使用replace(CharSequence, CharSequence)方法,执行文字String替换,即不是正则表达式.

如果你想要一个String[]每个数字在它自己的元素中,那么最简单的做法分两步:首先删除所有非数字,然后使用零长度断言来分割不是字符串开头的任何地方(?!^)(以防止变空string作为第一个元素).如果你想要一个char[],那么你可以打电话String.toCharArray()

最后,如果字符串可能很长,最好java.util.regex.Matcherfind()循环中查找数字\d,或者java.util.Scanner使用分隔符\D*,即非数字的序列(可能为空).这不会给你一个数组,但是你可以使用循环来填充a List(参见Effective Java 2nd Edition,Item 25:Prefer list to arrays).

参考


片段

以下是一些说明上述想法的示例:

    System.out.println(java.util.Arrays.toString(
        "---4--5-67--8-9---".split("-+")
    ));
    // [, 4, 5, 67, 8, 9]
    // note the empty string as first element

    System.out.println(
        "---4--5-67--8-9---".replace("-", "")
    );
    // 456789

    System.out.println(java.util.Arrays.toString(
        "abcdefg".toCharArray()
    ));
    // [a, b, c, d, e, f, g]
Run Code Online (Sandbox Code Playgroud)

下一个示例首先删除所有非数字\D,然后除了字符串的开头之外的任何地方拆分(?!^),以获得String[]包含数字的每个数字:

    System.out.println(java.util.Arrays.toString(
        "@*#^$4@!#5ajs67>?<{8_(9SKJDH"
            .replaceAll("\\D", "")
            .split("(?!^)")
    ));
    // [4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

这将使用Scanner,以\D*作为分隔符,让每一位作为自己的令牌,用它来填充List<String>:

    List<String> digits = new ArrayList<String>();
    String text = "(&*!@#123ask45{P:L6";
    Scanner sc = new Scanner(text).useDelimiter("\\D*");
    while (sc.hasNext()) {
        digits.add(sc.next());
    }
    System.out.println(digits);
    // [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

常见问题 split()

以下是处理时常见的初学者问题String.split:

第1课:split采用正则表达式模式

这可能是最常见的初学者错误:

System.out.println(java.util.Arrays.toString(
    "one|two|three".split("|")
));
// [, o, n, e, |, t, w, o, |, t, h, r, e, e]

System.out.println(java.util.Arrays.toString(
    "not.like.this".split(".")
));
// []
Run Code Online (Sandbox Code Playgroud)

这里的问题是,|并且.是正则表达式元字符,并且因为它们旨在按字面匹配,所以它们需要通过前面的反斜杠进行转义,反斜杠作为Java字符串文字"\\".

System.out.println(java.util.Arrays.toString(
    "one|two|three".split("\\|")
));
// [one, two, three]

System.out.println(java.util.Arrays.toString(
    "not.like.this".split("\\.")
));
// [not, like, this]
Run Code Online (Sandbox Code Playgroud)

第2课:split默认情况下丢弃尾随空字符串

有时需要保留尾随空字符串(默认情况下会丢弃split):

    System.out.println(java.util.Arrays.toString(
        "a;b;;d;;;g;;".split(";")
    ));
    // [a, b, , d, , , g]
Run Code Online (Sandbox Code Playgroud)

请注意,有对于"失踪"的价值观插槽c,e,f,但不hi.要解决此问题,您可以使用否定limit参数String.split(String regex, int limit).

    System.out.println(java.util.Arrays.toString(
        "a;b;;d;;;g;;".split(";", -1)
    ));
    // [a, b, , d, , , g, , ]
Run Code Online (Sandbox Code Playgroud)

还可以使用一个正limitÑ申请至多图案N - 1倍(即导致不超过Ñ数组中的元素).


零宽度匹配split示例

以下是在零宽度匹配结构上拆分的更多示例; 这可以用来分割字符串,但也保持"分隔符".

简单的句子分裂,保持标点符号:

    String str = "Really?Wow!This.Is.Awesome!";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[.!?])")
    )); // prints "[Really?, Wow!, This., Is., Awesome!]"
Run Code Online (Sandbox Code Playgroud)

使用将长字符串拆分成固定长度的部分 \G

    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"
Run Code Online (Sandbox Code Playgroud)

在大写字母前拆分(第一个除外!)

    System.out.println(java.util.Arrays.toString(
        "OhMyGod".split("(?=(?!^)[A-Z])")
    )); // prints "[Oh, My, God]"
Run Code Online (Sandbox Code Playgroud)

以下相关问题中提供了各种示例.

参考

相关问题


小智 5

你不要使用拆分!

拆分是为了获得分隔符之间的东西.

为此,你想要消除不必要的字符; ' - '

解决方案很简单

OUT = in.replaceAll( " - ", "");


归档时间:

查看次数:

5580 次

最近记录:

15 年,4 月 前