1

我写了这个正则表达式:

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

解析这样的事情:

lvt:vgt:mwi-ao:44.00m::::lvt_mlog:100.00: lvt2:vgt2:-wi-a-:908.00m::::::

1 组将是:lvt 2 组:vgt ... 4 组:44.00m

我想让它更短。

我尝试这样做:\\s+(?:([^:]+):)+

但在这种情况下,它只捕获最后一组。

结果将是:1组:44.00m

4

4 回答 4

1

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

\\s+([^:]+):([^:]+):([^:]+):([^:]+):
于 2012-07-24T08:55:44.580 回答
0

如果您正在寻找 ':' 之间的值,您可以使用 String.split(regex)

String[] result = 
   "lvt:vgt:mwi-ao:44.00m::::lvt_mlog:100.00: lvt2:vgt2:-wi-a-:908.00m::::::".split(":");

如果对您方便,它会比组正则表达式更快......而且它是您可以找到的更短的正则表达式

EDIT 错误注释被抑制
添加组

如果常规 ' ' ,则可以像这样找到组::::

for(int i = 0, n = result.length; i < n; i+= 6) {
    final String group1 = result[i];
    final String group2  =result[i+1];
    ...
}

否则while在最后一个空字段后使用并重新启动到 group1。

于 2012-07-24T09:07:03.787 回答
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

然后,您可以按“:”拆分组

于 2012-07-24T10:17:55.710 回答
0

在Java 中,您不能将多个匹配项捕获到一个组中,即不能使用(?:([^:]+):)+to collectlvt等一次将多个匹配项放入一个vgt组中。

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

编辑:我更新了答案以匹配已编辑的问题,该问题似乎用冒号(:)分隔“行”我的空格和字段。

于 2012-07-24T08:43:43.873 回答