我必须使用正则表达式组从字符串中提取值。
输入就是这样,
-> 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
但是,我的问题是只有第一组是强制性的,而其他组是可选的。
这就是为什么我需要正则表达式,它将检查所有模式并提取值。
答案 0 :(得分:2)
使用非捕获组并通过在这些组旁边添加?
量词将其转为可选。
^(\d+)(?:\((\d+|\*)\))?(?:\.(\d+))?$
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)
这是一种更易于理解的替代方法。
*
个字符
:
<强>代码:强>
String repl = input.replaceAll("[^\\d*]+", ":");
String[] tok = repl.split(":");