2012-07-24 51 views
1

我写这个正则表达式:我该如何缩短这个正则表达式?

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

解析这样的事情:

LVT:VGT:MWI-AO:44.00米:::: lvt_mlog:100.00: lvt2:vgt2:-wi-A - :908.00米::::::

而且

1组将是:LVT 2组:VGT ... 4组:44.00米

我想让它变短。

我尝试做以这样一种方式:\\s+(?:([^:]+):)+

但在这种情况下,只赶上最后一组。

结果将是: 1组:44.00米

+0

您使用的是'.match()'或'的.find()'? – npinti 2012-07-24 08:32:56

+0

如果文本中没有“:”匹配,为什么在组中有':'?除此之外,如果你想抓住4个组中的每一个组,AFAIK就没有办法在Java中缩短这个表达式。 – Thomas 2012-07-24 08:34:49

+0

我粘贴了不正确的文字。 – 2012-07-24 08:48:14

回答

1

你有很多不必要的非捕获括号,你可以删除:

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

请注意,除非文本匹配以空格开始,否则使用'\\ s +'不会匹配'lvt'等。您可能想使用'(?:^ | \\ s +)'代替。 – Thomas 2012-07-24 09:01:13

+0

@Thomas:你是对的 - 但看起来他的正则表达式已经在工作,他只是想缩短它。另外,'\ s *'可以代替'(?:^ | \\ s +)'。 – 2012-07-24 09:05:19

+0

似乎是这样,也许他在开始时有空白。顺便说一句,你可以通过删除最后的冒号使其更短:) – Thomas 2012-07-24 09:06:48

0

在Java中,你不能赶上多个匹配成一个组,即不能使用(?:([^:]+):)+收集lvtvgt等成一个组一个去。

你可以做的是打破了文成各行,如果你知道总会有4组,调用find()然后group(0) 4次连续使用这样的表达式:[^:]+。这应该在4次调用中捕获lvt,vgt,mwi-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 
} 

编辑:我更新了答案,以匹配编辑的问题,这似乎划“线”我的空白和领域由冒号(:)。

0

如果您正在寻找之间的值“:”您可以使用String.split(正则表达式)

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和最后一个空场后重新启动到组1。

+0

不,“split()”不会删除所有空字段。 – Thomas 2012-07-24 09:08:48

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.00米,开始:0,结束:22

组:lvt2:vgt2:-Wi-α-:908.00米,启动: 42,结束:67

然后,您可以拆分组 ':'