给定一个字符串,例如“TAG1: a,b,c TAG2: 123 TAG3: a,45,44,b”
Pattern tokens = Pattern.compile( "([a-zA-Z0-9]+):\\s*(\\w+(?:,?\\w+)*)" );
Matcher m = tokens.matcher( myString );
while( m.find() ) {
System.out.println( "tag:" + m.group(1) + " value:" + m.group(2) );
}
这涵盖了您的所有案例,并确保有一定的格式。如果您的问题有什么遗漏之处,请告诉我。
编辑 1:
要涵盖您的其他情况,您可以执行以下操作:
Pattern tokens = Pattern.compile( "([a-zA-Z0-9]+):\\s*(\\w+(?:[ ,]+?\\w+)*)(?=\\s+[a-zA-Z0-9]+:)|([a-zA-Z0-9]+):\\s*(\\w+(?:[ ,]+?\\w+)*)" );
然后还要检查第 3 组和第 4 组。
不过,这个正则表达式变得过于雄心勃勃了......虽然我不相信在这种情况下,一个完整的解析器会让你的生活变得更轻松。
另一种方法是一次将其分解为一个级别(无论如何解析器都会这样做):
Pattern main = Pattern.compile( "([a-zA-Z0-9]+):" );
Matcher m = main.matcher(myString);
int lastStart = 0;
while( m.find() ) {
if( lastStart != 0 ) {
processToken( myString.substring(lastStart, m.start()) );
}
lastStart = m.start();
}
processToken( myString.substring(lastStart) );
或者类似的东西。它类似于强制使用 & 类型的分隔符,但它考虑了作为标记语法的隐式分隔。