如何在Java中使用正则表达式拆分String而不会丢失数字

时间:2015-05-05 08:34:21

标签: java regex string


这是以下字符串
(R01)(R10)
输出应该是这样的:
1 10

我正在使用\\)|\\(|[A-Z],但它不起作用 我该怎么办?

5 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

"\\(R0*(\\d+)\\)"

表示表达式:

  • 应在括号"\\( \\)"
  • 以字符R
  • 开头
  • 然后是零或多个0 0*
  • 后跟您在组(\\d+)
  • 中捕获的一个或多个数字

0*将消耗匹配的第一个数字之前出现的每个0。因此,在' 000'的情况下,0*将消耗前两个0,因为我们需要至少一个数字后(这将是最后的0)。可能会涉及一些回溯。

例如:

String s = "(R0)(R10)(R001)(R000)";
Pattern p = Pattern.compile("\\(R0*(\\d+)\\)");

Matcher m = p.matcher(s);
while(m.find()) {
    System.out.println(m.group(1));
}

输出:

0
10
1
0

答案 1 :(得分:0)

try {
    String resultString = subjectString.replaceAll("([^\\d][0]|\\D)", "");
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
} catch (IllegalArgumentException ex) {
    // Syntax error in the replacement text (unescaped $ signs?)
} catch (IndexOutOfBoundsException ex) {
    // Non-existent backreference used the replacement text
}

说明:

([^\d][0]|\D)

Match the regex below and capture its match into backreference number 1 «([^\d][0]|\D)»
   Match this alternative «[^\d][0]»
      Match a single character that is NOT a “digit” «[^\d]»
      Match the character “0” literally «[0]»
   Or match this alternative «\D»
      Match a single character that is NOT a “digit” «\D»

答案 2 :(得分:0)

对于正则表达式位,您可能想了解lookahead/lookbehind

(?<=R)\d+

然后在匹配项上使用Integer.parseInt

练习正则表达式:http://www.regexplanet.com/advanced/java/index.html和其他许多人

答案 3 :(得分:0)

你可以这样做:

String in = "(R01)(R10)";
System.out.println(Arrays.toString(
    Pattern.compile("(?:\\D+0*)").splitAsStream(in)
   .filter(x -> x.length()>0).toArray()
));

输出:[1, 10]

这个结构的优点是你可以轻松扩展它,例如获取浮点数而不是字符串:

String in = "(R01)(R10)";
System.out.println(Arrays.toString(
    Pattern.compile("(?:\\D+)").splitAsStream(in)
    .filter(x -> x.length() > 0).map(Float::parseFloat)
    .toArray()
));

输出:[1.0, 10.0]

答案 4 :(得分:0)

此代码适用于您:

public static void main(String[] args) {
    String s = "(R01)(R10)";
    s = s.replaceAll(".*?(\\d+.*\\d+).*", "$1"); // replace leading/ trailing non-numeric charcaters.
    String[] arr = s.split("\\D+"); // split based on non-numeric characters
    for (int i = 0; i < arr.length; i++) {
        arr[i] = String.valueOf(Integer.parseInt(arr[i])); // convert to base-10 i.e, remove the leading "0"

    }
    for (String str : arr)
        System.out.println(str);
}

O / P:

1 
10