2017-02-08 101 views
2

考慮下面的字符串,由「+」(加號)分隔類別正則表達式來得到一個或兩個分隔符

a1 
a1+b1 
a1+b2 
a1+b1+c1 
a2+b3 
a2+b4 

我想提取所有類別之間的字符串。這必須在多次運行中完成,每個級別運行一次。鑑於該實施例中,將需要三個運行:

1趟

a1 
a1 
a1 
a1 
a2 
a2 

運行2

b1 
b2 
b1 
b3 
b4 

運行3

c1 

我已經有了一些代碼,但是因爲我有更多的關卡,所以我想讓它更具可讀性,所以我可以很容易地指出我想提取的哪個級別(因此有多少個加號)。

這是我的水平目前正則表達式3

^[^\+]*\+[^\+]*\+([^\+]*)\+?.* 

FYI:這個代碼與Cellfie for Protégé運行,它使用Java正則表達式模式

回答

作爲未來的參考,這是我在Cellfie的幫助下在this answer

extract multiple levels divided by delimiter

但是,我仍然只有空白字符作爲結果...無論如何排除這些?

+7

在「+」字符上分割線是不是更容易? – MaxZoom

+0

確實會更容易些,但我使用的程序無法做到這一點,而且我也不想在此過程中採取其他步驟。 – intrixius

+0

你不能做簡單的'string.split(「\\ +」)[level]'? – cybersoft

回答

1

您的原始圖案很好。我只想,使其更具可讀性像這樣:

  • ^(?:[^+]*\+){2}([^+]*)其中{2}是加號的數量跳過。

請注意,當它位於字符類內部時,您不需要轉義加號。

或者,如果你喜歡\w爲Edulynch建議,那麼這將是:

  • ^(?:\w*\+){2}(\w*)

但我發現,一個要少可讀,當作爲一個Java字符串編碼,因額外的反斜槓。

+0

這正是我需要的!還有一個小問題:我怎樣才能避免返回空格?顯然有時會返回「」(一個空格),我想排除那些在一個值內可以包含空格的 – intrixius

+0

,但是如果它只包含空格,則應該排除 – intrixius

+0

這將修剪字符串中的前導空格:'^(?: [^ +] * \ +){2} \ s *([^ +] *)' –

2

這應該工作。

正則表達式:

(\w+)(?:\+(\w+))?(?:\+(\w+))? 

輸入:

a1 
a1+b1 
a1+b2 
a1+b1+c1 
a2+b3 
a2+b4 

輸出:

enter image description here

Java代碼:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class JAVAOCA { 

    public static void main(String[] args) { 
     final String regex = "(\\w+)(?:\\+(\\w+))?(?:\\+(\\w+))?"; 
     final String string = "a1\n" 
       + "a1+b1\n" 
       + "a1+b2\n" 
       + "a1+b1+c1\n" 
       + "a2+b3\n" 
       + "a2+b4"; 

     final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE); 
     final Matcher matcher = pattern.matcher(string); 

     while (matcher.find()) { 
      for (int i = 1; i <= matcher.groupCount(); i++) { 
       System.out.println("Group " + i + ": " + matcher.group(i)); 
      } 
     } 
    } 
} 

組:

$ 1

a1 
a1 
a1 
a1 
a2 
a2 

$ 2

b1 
b2 
b1 
b3 
b4 

$ 3

c1 

請參閱:https://regex101.com/r/qSz5WT/1

+0

會看看它,看起來很有前途... regex101網站也非常有幫助! – intrixius

+0

我已經添加了組(Run1 = $ 1,Run2 = $ 2和Run3 = $ 3)。 –

+0

爲什麼Pattern.MULTILINE?你既不使用'^'也不使用''''。 –

0

試着用分隔符分隔每個字符串。

int max_level=0; 
ArrayList<ArrayList<String>> levels = new ArrayList<ArrayList<String>>(); 
for(int i=0;i<inputs.length;i++) 
    { 
    items=inputs[i].split("\\+"); 
    for(int j=0;j<items.length;j++) 
     { 
     if(j>max_level) 
     { 
     max_level=j; 
     ArrayList<String> strings=new ArrayList<>(); 
     levels.add(strings); 
     } 
     levels.get(j).add(items[j]); 
     } 
    } 

現在levels.get(0)會給你第一級的項目列表。這裏使用的唯一正則表達式是\\+

+0

我無法使用Java代碼。我每次只能使用一個正則表達式... – intrixius

0

因爲你有3分,並希望每次他們的一個比賽你只需要一個正則表達式有可選\w+也可選\+。而已。

結果
/(\w+)?\+?(\w+)?\+?(\w+)?/

然後
$1包含第一列
$2包含第二列
$3包含第三列
prove

0

根據您從帕特里克接受了解決方案:

^(?:[^+]*\+){2}([^+]*) 

(識別第三組的利息),以避免空字符串匹配問題,你可以嘗試用+將最後*

^(?:[^+]*\+){2}([^+]+) 

這不應與空字符串匹配。

+0

我已經試過了,沒有成功... – intrixius

相關問題