2010-12-08 110 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]+