如何缩短此正则表达式?

时间:2012-07-24 08:28:11

标签: java regex

我写了这个正则表达式:

\\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

4 个答案:

答案 0 :(得分:1)

您可以删除许多不必要的非捕获括号:

\\s+([^:]+):([^:]+):([^:]+):([^:]+):

答案 1 :(得分:0)

在Java中,您无法将多个匹配项捕获到一个组中,即无法使用(?:([^:]+):)+lvtvgt等一次性收集到一个组中。

您可以做的是将文本分成单独的行,如果您知道总有4个组,请使用如下表达式连续4次调用find()然后group(0):{{ 1}}。这应该会在4次调用中捕获[^:]+lvtvgtmwi-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;

分组