Java reg表达式捕获字符串
我有以下字符串:Java reg表达式捕获字符串,java,regex,Java,Regex,我有以下字符串: "(1)name1:content1(2)name2:content2(3)name3:content3...(n)namen:contentn" 我想做的是捕获每个名称\u I和内容\u I,我该怎么做?我应该提到,name\u I是未知的。例如,name1可以是“abc”,name2可以是“xyz” 我所尝试的: String regex = "\\(\\d\\)(.*):(.*)(?=\\(\\d\\))"; Pattern pattern = Pattern.comp
"(1)name1:content1(2)name2:content2(3)name3:content3...(n)namen:contentn"
我想做的是捕获每个名称\u I
和内容\u I
,我该怎么做?我应该提到,name\u I
是未知的。例如,name1
可以是“abc”
,name2
可以是“xyz”
我所尝试的:
String regex = "\\(\\d\\)(.*):(.*)(?=\\(\\d\\))";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
System.out.println(matcher.group(0);
System.out.println(matcher.group(1);
System.out.println(matcher.group(2);
}
但结果不是很好。我还尝试了
matcher.mathes()
,什么也不会返回。您的表达式非常匹配-您的第一组先吃掉冒号,因此无法匹配整个表达式。您可以使用非贪婪匹配(使用问号,如*?
)使模式匹配
String regex = "\\(\\d\\)(.*?):(.*?)(?=\\(\\d\\))";
如果您的姓名和内容不包含任何非“单词”边界字符,则此操作有效:
public static void test(String input){
String regexpp = "\\(\\d+\\)(\\w+):(\\w+)";
Pattern p = Pattern.compile(regexpp);
Matcher m = p.matcher(input);
while(m.find()){
System.out.println("Name: " + m.group(1));
System.out.println("Content: " + m.group(2));
}
}
输出:
Name: name1
Content: content1
Name: name2
Content: content2
Name: name3
Content: content3
Name: name99
Content: content99
你可以用
String s = "(1)name1:content1(2)name2:content2(3)name3:content3...(4)namen:content4";
Pattern pattern = Pattern.compile("\\(\\d+\\)([^:]+):([^(]*(?:\\((?!\\d+\\))[^(]*)*)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
见
详细信息
-匹配\\(\\d+\\)
子字符串,其中(x)
是一个或多个数字x
-第1组:一个或多个字符,而不是([^::]+)
:
-冒号:
-第二组:([^(]*(?:\\(?!\\d+\\)[^(]*)*)
-除[^(]*
(
-零个或多个以下序列:(?:\\((?!\\d+\\)[^(]*)*
-a\\((?!\\d+\\)
后面不跟1+数字和(
)
-0+字符,而不是[^(]*
(
您可以使用我建议的可读性较差但更宽松有效的正则表达式:
“\\(\\d+\\)([^:]+):([^(]*(?:\\(?!\\d+\\)[^(]*)”
谢谢您的建议。它比我的效果更好。但仍然只有第一组,即name1
,content1
,在matcher.group()中返回
。谢谢您的回复。但是名称\u i
未知。例如name1
可以是“abc”
,name2
可以是“xyz”
。您可以在问题中说明确切的字符串。最好提供一个更具代表性的示例,以免混淆其他示例。:
不需要在正则表达式中转义