【问题标题】:Capturing numbers with regex使用正则表达式捕获数字
【发布时间】:2014-06-17 19:25:14
【问题描述】:

我有这些包含数字集的字符串。我需要做的是捕获每一组数字并为它们创建新的字符串。例如,在字符串:“60 32 28 Some Characters 0 0 0”中,我需要捕获并将 60、32、28、0、0、0 放入单独的字符串中。这是我已经尝试过的一些代码:

public class First {

public static void main(String[] args) {

    String one = "60 32 28 Some Characters 0 0 0";


    Pattern a = Pattern.compile("[0-9]{2}.*?([0-9]{2}).*?([0-9]{2})");      
    Matcher b = a.matcher(one);
    b.find();

    String work = b.group();
    String work1 = b.group(1);
    String work2 = b.group(2);

    System.out.println("this is work: " + work);
    System.out.println("this is work1: " + work1);
    System.out.println("this is work2: " + work2);

    Pattern c = Pattern.compile("([0-9]{2})|([0-9])");      
    Matcher d = c.matcher(one);
    d.find();

    String work3 = d.group();
    System.out.println(work3);



}

}

但是,我无法捕获每个数字。我查看了其他教程,但我找不到我的正则表达式做错了什么,或者除了使用正则表达式之外是否还有其他解决方案。我一直远离使用子字符串,因为数字之间的文本通常长度不同。任何帮助将不胜感激。

【问题讨论】:

  • 您也许可以一次捕获一个数字,循环并将每个数字添加到一个数组中,然后使用该数组获取所需数字的变量。
  • 您是否尝试使用 3 个匹配组捕获 6 个单独的字符串?
  • @Jerry,我会将每个都放入一个数组中,但字符串本身已经在一个数组中,需要匹配单独数组中的项目。我希望远离另一个阵列哈。
  • @MxyL,对不起,我尝试使用更多匹配组,但遇到了 indexoutofboundsexception 错误

标签: java regex


【解决方案1】:
String[] strings = one.split("[^\\d]+");

这会将一个或多个非数字的每个序列视为分隔符,并返回结果数组。几乎正是您想要的,对吧?

这也有效,但我通常会忘记表示“不”的内置字符类(感谢@Pshemo):

String[] strings = one.split("\\D+");

一个警告:Strings 的第一个元素可能是一个空字符串。如果第一个字符不是数字,则会发生这种情况。来自@Ruslan Ostafiychuk,以下是我们如何通过剥离领先的非数字来修复它:

String[] strings = one.replaceFirst("^\\D+","").split("\\D+");

【讨论】:

  • 您可以将[^\\d] 替换为\\D
  • 好正则表达式! +1。简单而强大的解决方案。
  • 一个警告:如果字符串类似于"foo 1 bar 2",这种方法可能会导致结果数组开头出现空字符串。
  • @Pshemo 是的,你的脑电波传到我这里,让我在你输入评论之前编辑我的帖子...... :)
  • @ajb 我们可以处理它: String[] strings = one.replaceFirst("^[\\D]+","").split("[\\D]+");
【解决方案2】:

试试这个:

        Pattern c = Pattern.compile("([0-9][0-9]) | [0-9]");      
        Matcher d = c.matcher(one);
        while(d.find()) {
               System.out.println(d.group());
        }

它将匹配 2 位数字和 1 位数字。

结果:

60 
32 
28 
 0
 0
 0

【讨论】:

  • 效果很好,但是将它们放在一个数组中实际上可以更好地满足我的需要,不过我应该在我的问题上更具体一些。感谢您的回复。
【解决方案3】:

以下内容:

Pattern a = Pattern.compile("([0-9]{1,2})\\D*([0-9]{1,2})\\D*([0-9]{1,2})");
Matcher b = a.matcher(one);
while (b.find()) {

    String work = b.group(1);
    String work1 = b.group(2);
    String work2 = b.group(3);

    System.out.println("this is work: " + work);
    System.out.println("this is work1: " + work1);
    System.out.println("this is work2: " + work2);

}

输出:

这是工作:60

这是作品1:32

这是工作2:28

这是工作:0

这是工作1:0

这是工作2:0

【讨论】:

    【解决方案4】:

    据我了解,您有包含空格分隔数字的字符串。如果这是正确的,我建议你用空格分割字符串:

    String[] strNums = str.split("\\s+");
    

    现在如果您的原始字符串是60 32 28 Some Characters 0 0 0,您的数组将包含:603228SomeCharacters000

    现在遍历这个数组并只取匹配的元素:

    List<Integer> numbers = new ArrayList<>();
    for (String s : strNums) {
       try {
            numbers.add(Integer.parseInt(s));
       } catch (NumberFormatException e) {
            // ignore
       }
    }
    

    【讨论】:

      【解决方案5】:

      简单地循环你的 Matcher 的 match() 方法。此代码打印每个匹配的数字:

      import java.util.*;
      import java.util.regex.*;
      
      public class Main {
          public static void main(String[] args) {
              String input = "60 32 28 Some Characters 0 0 0";
      
              Pattern a = Pattern.compile("\\D*(\\d+)");      
              Matcher b = a.matcher(input);
              List<String> nums = new ArrayList<String>();
              while (b.find()) {
                     System.out.println("Matched " + b.group(1));
                      nums.add(b.group(1));
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-02
        • 2023-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-21
        • 1970-01-01
        相关资源
        最近更新 更多