【问题标题】:Extract numbers and names from string从字符串中提取数字和名称
【发布时间】:2013-06-18 09:17:12
【问题描述】:

我的目标是从 java 中的字符串中提取名称和数字。 示例:输入 -> 输出

1234 -> 数字:[1234],名称:[]

1234,34,234 -> 数字:[1234, 34, 234],名称:[]

12,foo,123 -> 数字:[12, 123],名称:[foo]

foo3,1234,4bar,12,12foo34 -> 数字:[1234, 12],名称:[foo3, 4bar, 12foo34]

foo,bar -> -> 数字:[],名称:[foo, bar]

我想出了[^,]+(,?!,+)*,它匹配字符串的所有部分,但我不知道如何只匹配数字或名称(名称可以包含数字 - 如示例所示)。 谢谢

【问题讨论】:

  • 你可以只使用 OR 和组:(\d+)|([a-zA-Z]+)demo
  • 另外命名的组可能很有趣,因为我不是 java 开发者,看看这个answer

标签: java regex


【解决方案1】:

这是一个纯正则表达式的解决方案:

(?:(\d+)|([^,]+))(?=,|$)

第一组(\d+) 捕获数字,第二组([^,]+) 捕获其余部分。组后面必须跟逗号或行尾(?=,|$)

快速演示:

Pattern p = Pattern.compile("(?:(\\d+)|([^,]+))(?=,|$)");
Matcher m = p.matcher("foo3,1234,4bar,12,12foo34");

while (m.find()) {
    System.out.println(m.group(1) != null 
        ? "Number: " + m.group(1)  
        : "Non-Number: " + m.group(2));
}

输出:

Non-Number: foo3
Number: 1234
Non-Number: 4bar
Number: 12
Non-Number: 12foo34

【讨论】:

  • 为什么不只是\d+|[^,]+?那么不需要捕获组,匹配器的.group() 将返回所需的值
  • 你忘了排除空格:p
  • @fge:因为那时,你知道匹配是数字还是非数字
  • @HamZa:OP 在他们的示例中没有空格
  • @LukasEder 你知道在这两种情况下,看看我的回答
【解决方案2】:

给你:

        String a = "abc,123,abs12,12ab";
        ArrayList<String> numbers = new ArrayList<>();
        ArrayList<String> letters = new ArrayList<>();
        String ar[] = (a.split(","));
        for (String string : ar) {
            try{
                Long.parseLong(string);
                numbers.add(string);
            }catch(NumberFormatException ex){
                letters.add(string);
            }
        }

上述解决方案处理整数位可以在字符串中的任何位置的情况。不仅在开头或结尾。

【讨论】:

    【解决方案3】:

    您可以使用Scanner

    Scanner sc = new Scanner(input);
    sc.useDelimiter(",");
    while(sc.hasNext()) {
        if(sc.hasNextInt()) {
            int readInt = sc.nextInt();
            // do something with the int
        } else {
            String readString = sc.next();
            // do something with the String
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2022-08-12
      • 2019-08-22
      相关资源
      最近更新 更多