java split()的问题

时间:2010-08-05 09:21:25

标签: java regex

我有一个字符串:

strArray= "-------9---------------";

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

strArray= "---4-5-5-7-9---------------";

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

strArray= strignId.split("-");

但它会出错,因为有多个' - '并且我没有得到我的输出。那么应该使用java的哪个函数?

我的输入和输出应如下:

input="-------9---------------";
    output="9";
input="---4-5-5-7-9---------------";
    output="45579";

我该怎么办?

3 个答案:

答案 0 :(得分:19)

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

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

如果你想要一个String[],每个数字都在自己的元素中,那么最简单的方法就是分两步:首先删除所有非数字,然后使用零长度断言来分割那些不是开头的字符串(?!^)(以防止将空字符串作为第一个元素)。如果您想要char[],那么您只需拨打String.toCharArray()

即可

最后,如果字符串可能很长,最好在find()循环中使用java.util.regex.Matcher查找数字\d,或使用java.util.Scanner分隔符\D*,即非数字的序列(可能为空)。这不会给你一个数组,但你可以使用循环来填充List(参见 Effective Java 2nd Edition,Item 25:Prefer lists 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]

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

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

这使用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]

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(".")
));
// []

这里的问题是|.是正则表达式元字符,并且因为它们是字面上匹配的,所以它们需要通过前面的反斜杠进行转义,反斜杠作为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]

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

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

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

请注意,cef的“缺失”值有插槽,但hi没有。要解决此问题,您可以对String.split(String regex, int limit)使用负limit参数。

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

您还可以使用 n 的正limit来最多 n - 1 次应用模式(即导致不超过 n 数组中的元素。)


零宽度匹配split示例

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

简单的句子分割,保留标点符号:

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

使用\G

将长字符串拆分为固定长度的部分
    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"

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

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

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

参考

相关问题

答案 1 :(得分:5)

你不使用拆分!

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

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

解决方案很简单

出= in.replaceAll( “ - ”, “”);

答案 2 :(得分:0)

使用类似的东西来分割单个值。我宁愿首先消除不需要的字符,以避免在结果数组中得到空/ null字符串。


final Vector nodes = new Vector();
int index = original.indexOf(separator);
while (index >= 0) {
  nodes.addElement(original.substring(0, index));
  original = original.substring(index + separator.length());
  index = original.indexOf(separator);
}
nodes.addElement(original);
final String[] result = new String[nodes.size()];
if (nodes.size() > 0) {
  for (int loop = 0; loop smaller nodes.size(); loop++) {
    result[loop] = (String) nodes.elementAt(loop);
  }
}
return result;
}