2010-12-08 112 views
2

我的组可以是x/y,x.y或x_y.z格式。每个组由下划线分隔。这些团体无序。正则表达式捕获组

例子:

ABC/DEF_abc.def_PQR/STU_ghi_jkl.mno 

我想捕捉如下:

ABC/DEF 
abc.def 
PQR/STU 
ghi_jkl.mno 

我有这样的使用相当冗长字符串迭代和分析方法(如下图所示),但我想知道如果做一个简单的正则表达式可以做到这一点。

private static ArrayList<String> go(String s){ 
    ArrayList<String> list = new ArrayList<String>(); 
    boolean inSlash = false; 
    int pos = 0 ; 
    boolean inDot = false; 
    for(int i = 0 ; i < s.length(); i++){ 
     char c = s.charAt(i); 
     switch (c) { 
     case '/': 
      inSlash = true; 
      break; 
     case '_': 
      if(inSlash){ 
       list.add(s.substring(pos,i)); 
       inSlash = false; 
       pos = i+1 ; 
      } 
      else if (inDot){ 
       list.add(s.substring(pos,i)); 
       inDot = false; 
       pos = i+1; 
      } 
      break; 
     case '.': 
      inDot = true; 
      break; 
     default: 
      break; 
     } 

    } 
    list.add(s.substring(pos)); 
    System.out.println(list); 
    return list; 
} 
+0

下划线可以作为分隔符以及作为一个组的一部分? – 2010-12-08 12:49:42

+0

困难似乎是在最后一组类型中(与它的下划线)。你能否详述一下下划线何时应该是组的一部分,什么时候应该是分隔符的规则?也许你可以发布你当前的代码。 – Jordi 2010-12-08 12:50:17

+0

是的,这是有趣的部分:)也许某种方式来展望一个点,然后确定它是否是一个delim或组? – dogbane 2010-12-08 12:51:04

回答

2

有一试:

((?:[^_./]+/[^_./]+)|(?:[^_./]+\.[^_./]+)|(?:[^_./]+(?:_[^_./]+)+\.[^_./]+)) 

我不知道Java的语法,但在Perl:

#!/usr/bin/perl 
use 5.10.1; 
use strict; 
use warnings; 

my $str = q!ABC/DEF_abc.def_PQR/STU_ghi_jkl.mno_a_b_c.z_a_b_c_d.z_a_b_c_d_e.z!; 
my $re = qr!((?:[^_./]+/[^_./]+)|(?:[^_./]+\.[^_./]+)|(?:[^_./]+(?:_[^_./]+)+\.[^_./]+))!; 
while($str=~/$re/g) { 
    say $1; 
} 

会产生:

ABC/DEF 
abc.def 
PQR/STU 
ghi_jkl.mno 
a_b_c.z 
a_b_c_d.z 
a_b_c_d_e.z 
0

下划线可能有问题,因为它并不总是分隔符。

可能:((?<=_)\w+_)?\w+[./]\.w+

+0

请在Java正则表达式中使用`\ w`非常谨慎:它[几乎总是错误的](http://stackoverflow.com/questions/4304928/unicode-equivalents-for-w-and- b-IN-java的正则表达式/ 4307261#4307261)。 ☹ – tchrist 2010-12-08 15:07:04

0

此正则表达式可能会做(与.net正则表达式测试):

[a-zA-Z]+[./][a-zA-Z]+|[a-zA-Z]+_[a-zA-Z]+\.[a-zA-Z]+ 

(如果你知道你的输入结构良好,没有必要分隔明确匹配)

0

这一个去与积极向前看,而不是交替

[A-Za-z]+(_(?=[A-Za-z]+\.[A-Za-z]+))?[A-Za-z]+[/.][A-Za-z]+