使用regex组从字符串中提取值

时间:2015-01-23 11:38:37

标签: java regex string

我必须使用正则表达式组从字符串中提取值。

输入就是这样,

-> 1
-> 5.2
-> 1(2)
-> 3(*)
-> 2(3).2
-> 1(*).5

现在我编写以下代码来获取这些输入的值。

String stringToSearch = "2(3).2";
Pattern p = Pattern.compile("(\\d+)(\\.|\\()(\\d+|\\*)\\)(\\.)(\\d+)");
Matcher m = p.matcher(stringToSearch);

System.out.println("1: "+m.group(1)); // O/P: 2
System.out.println("3: "+m.group(3)); // O/P: 3
System.out.println("3: "+m.group(5)); // O/P: 2

但是,我的问题是只有第一组是强制性的,而其他组是可选的。

这就是为什么我需要正则表达式,它将检查所有模式并提取值。

2 个答案:

答案 0 :(得分:2)

使用非捕获组并通过在这些组旁边添加?量词将其转为可选。

^(\d+)(?:\((\d+|\*)\))?(?:\.(\d+))?$

DEMO

Java正则表达式,

"(?m)^(\\d+)(?:\\((\d\+|\\*)\\))?(?:\\.(\\d+))?$"

示例:

String input = "1\n" + 
        "5.2\n" + 
        "1(2)\n" + 
        "3(*)\n" + 
        "2(3).2\n" + 
        "1(*).5";
Matcher m = Pattern.compile("(?m)^(\\d+)(?:\\((\\d+|\\*)\\))?(?:\\.(\\d+))?$").matcher(input);
while(m.find())
{
    if (m.group(1) != null)
    System.out.println(m.group(1));
    if (m.group(2) != null)
    System.out.println(m.group(2));
    if (m.group(3) != null)
    System.out.println(m.group(3));
}

答案 1 :(得分:1)

这是一种更易于理解的替代方法。

  1. 首先用冒号
  2. 替换所有非数字,非*个字符
  3. :
  4. 拆分

    <强>代码:

    String repl = input.replaceAll("[^\\d*]+", ":");
    String[] tok = repl.split(":");
    

    RegEx Demo