我写了这个正则表达式:
\\s+(?:([^:]+):)(?:([^:]+):)(?:([^:]+):)(?:([^:]+):)
解析这些事情:
LVT:VGT:MWI-AO:44.00米:::: lvt_mlog:100.00: lvt2:vgt2:-Wi-A-:908.00米::::::
并且
1组将是:lvt 2组:vgt ... 4组:44.00m
我想缩短它。
我尝试以这种方式执行此操作:\\s+(?:([^:]+):)+
但在这种情况下,它只捕获最后一组。
结果将是: 1组:44.00m
答案 0 :(得分:1)
您可以删除许多不必要的非捕获括号:
\\s+([^:]+):([^:]+):([^:]+):([^:]+):
答案 1 :(得分:0)
在Java中,您无法将多个匹配项捕获到一个组中,即无法使用(?:([^:]+):)+
将lvt
,vgt
等一次性收集到一个组中。
您可以做的是将文本分成单独的行,如果您知道总有4个组,请使用如下表达式连续4次调用find()
然后group(0)
:{{ 1}}。这应该会在4次调用中捕获[^:]+
,lvt
,vgt
和mwi-ao
。
某些伪代码(未经过测试,因此可能包含拼写错误:)):
44.00m
修改:我更新了答案,以匹配编辑过的问题,该问题似乎用冒号(Pattern p = Pattern.compile("[^:]+");
String input = ...;
String[] lines = input.split("\\s");
for( String line : lines ) {
//note that for simple cases like above you could also just split by ":"
Matcher m = p.matcher(line);
List<String> elements = new LinkedList<String>();
while( m.find() ) {
elements.add( m.group(0) );
}
//get the first 4 elements from the list
//if there are less then 4 in the list, the line didn't match
}
)划分“空白”字段和字段。
答案 2 :(得分:0)
如果要查找':'之间的值,可以使用String.split(regex)
String[] result =
"lvt:vgt:mwi-ao:44.00m::::lvt_mlog:100.00: lvt2:vgt2:-wi-a-:908.00m::::::".split(":");
如果方便你,它会比群组正则表达式更快......而是你能找到的更短的正则表达式
编辑错误的注释被抑制 添加群组
如果定期“::::
”:
for(int i = 0, n = result.length; i < n; i+= 6) {
final String group1 = result[i];
final String group2 =result[i+1];
...
}
否则使用while
并在最后一个空字段后重新启动到group1。
答案 3 :(得分:0)
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class RegexTest{
public static void main(String[] args){
Pattern pat= Pattern.compile("\\s(([^:]+):){3}([^:]+)");
Matcher mat= pat.matcher(" lvt:vgt:mwi-ao:44.00m::::lvt_mlog:100.00: lvt2:vgt2:-wi-a-:908.00m::::::");
while(mat.find()){
System.console().format("group: %s , start: %d , end: %d\\n",
mat.group(), mat.start(), mat.end());
}
}
}
组:lvt:vgt:mwi-ao:44.00m,开始:0,结束:22
组:lvt2:vgt2:-wi-a-:908.00m,开始:42,结束:67
然后,您可以按&#39;:&#39;
分组