需要一个始终匹配的正则表达式(使用matches()
,而不是find()
)并始终识别3个组,用于3种不同的输入情况,例如
模式
(?:^(\d+)\s+(\S)\s)?\s*([^\(]+\(\S+\))
表示每个组中预期的值类型(不假设字符的位置),但只能在#1的情况下正常工作,生成
1234, ab$.5!c:d6, efg(789)
对于情况2和3,相同的模式不起作用,分别给出
null, null, ab$.5!c:d6 efg(789)
null, null, efg(789)
有什么想法吗?
答案 0 :(得分:1)
您可以使用以下正则表达式。
^(?:(\d+)\s+(?:(\S+)\s)?)?([^(]+\([^)]*\))$
String s = "1234 efg(567)";
Matcher m = Pattern.compile("^(?:(\\d+)\\s+(?:(\\S+)\\s)?)?([^(]+\\([^)]*\\))$").matcher(s);
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));
}