2011-08-04 58 views
21

一個項目是以逗號分隔的一個或多個數字或字符串的列表,例如Java正則表達式:重複捕獲組

"12" 
"abc" 
"12,abc,3" 

我想要在Java中匹配零個或多個項目的方括號列表,例如

"" 
"(12)" 
"(abc,12)" 
"(abc,12),(30,asdf)" 
"(qqq,pp),(abc,12),(30,asdf,2)," 

應分別返回下列匹配組的最後一個例子

qqq,pp 
abc,12 
30,asdf,2 

我已經想出以下(不正確)模式

\((.+?)\)(?:,\((.+?)\))* 

只匹配以下最後一個例子

qqq,pp 
30,asdf,2 

提示?謝謝

+2

你能不能把字符串分割成「),(」和刪除剩餘的括號來實現你的結果? – Jens

+0

絕對需要['Matcher.find()'](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#find())。 – Qix

回答

33

沒錯。 Java正則表達式中不能包含「可變」數量的捕獲組。你的模式有兩種:

\((.+?)\)(?:,\((.+?)\))* 
    |___|  |___| 
group 1  group 2 

每個組將包含該組的最後一場比賽內容。即,abc,12將被30,asdf,2覆蓋。

相關問題:

的解決方案是使用一種表達(像\((.+?)\)),並使用matcher.find遍歷匹配。

+0

阿格好,謝謝我不知道,現在我得找出替代 –

+0

是的。這很令人討厭。 .net有這個功能(如我在鏈接到的問題/答案中看到的那樣)。 – aioobe

+5

@David,萬一你錯過了,他已經給了你一個很好的選擇:) – Svish

2

您可以在循環中使用像([^,]+)這樣的正則表達式,或者僅使用str.split(",")來一次獲取所有元素。此版本:str.split("\\s*,\\s*")甚至允許空格。

0

這可能是溶液:

package com.drl.fw.sch; 

import java.util.regex.Pattern; 

public class AngularJSMatcher extends SimpleStringMatcher { 

Matcher delegate; 


public AngularJSMatcher(String lookFor){ 
    super(lookFor); 
    // ng-repeat 
    int ind = lookFor.indexOf('-'); 
    if(ind >= 0){ 
     StringBuilder sb = new StringBuilder(); 
     boolean first = true; 
     for (String s : lookFor.split("-")){ 
      if(first){ 
       sb.append(s); 
       first = false; 
      }else{ 
       if(s.length() >1){ 
        sb.append(s.substring(0,1).toUpperCase()); 
        sb.append(s.substring(1)); 

       }else{ 
        sb.append(s.toUpperCase()); 
       } 
      } 
     } 
     delegate = new SimpleStringMatcher(sb.toString()); 
    }else { 
     String words[] = lookFor.split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])"); 
     if(words.length > 1){ 
      StringBuilder sb = new StringBuilder(); 
      for (int i=0;i < words.length;i++) { 
       sb.append(words[i].toLowerCase()); 
       if(i < words.length-1) sb.append("-"); 
      } 
      delegate = new SimpleStringMatcher(sb.toString()); 
     } 

    } 

} 

@Override 
public boolean match(String in) { 
    if(super.match(in)) return true; 
    if(delegate != null && delegate.match(in)) return true; 

    return false; 
} 

public static void main(String[] args){ 
    String lookfor="ngRepeatStart"; 

    Matcher matcher = new AngularJSMatcher(lookfor); 

    System.out.println(matcher.match("<header ng-repeat-start=\"item in items\">")); 
    System.out.println(matcher.match("var ngRepeatStart=\"item in items\">")); 

} 

}

1

(^ | \ S +)(\ S *)(($ | \ S +)\ 2)+與忽略大小寫選項/ I

她左側左側左側現在

例如這裏 - https://regex101.com/r/FEmXui/2

Match 1 
Full match 3-23 ` left LEft leFT LEFT` 
Group 1. 3-4 ` ` 
Group 2. 4-8 `left` 
Group 3. 18-23 ` LEFT` 
Group 4. 18-19 ` `