正则表达式匹配固定位置的缺失组
regex to match absent groups at fixed locations
需要一个始终匹配(与 matches()
,而不是 find()
)并且始终识别 3 组的正则表达式,用于 3 种不同的输入情况,例如
- 1234 ab$.5!c=:d6 efg(789)
- 1234 EFG(567)
- efg(567)
模式
(?:^(\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)
有什么想法吗?
您可以使用下面的正则表达式。
^(?:(\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));
}
需要一个始终匹配(与 matches()
,而不是 find()
)并且始终识别 3 组的正则表达式,用于 3 种不同的输入情况,例如
- 1234 ab$.5!c=:d6 efg(789)
- 1234 EFG(567)
- efg(567)
模式
(?:^(\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)
有什么想法吗?
您可以使用下面的正则表达式。
^(?:(\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));
}