2012-07-24 70 views
1

在構建正則表達式字符串時,我迷了路。我需要一個正則表達式來執行以下操作。java中的正則表達式幫助

我有以下字符串:

[~class:obj] 
[~class|class2|more classes:obj] 
[!class:obj] 
[!class|class2|more classes:obj] 
[?method:class] 
[text] 

字符串可以有上述最新的倍數。示例字符串將是「[如果] [!類:obj]」

我想知道[]之間的內容和分解到匹配組。例如,如果第一個匹配組存在(〜|!|?)之後的符號,那麼可以是class或class | class2 | etc ...然後右邊的是:和在]之前停止。可能沒有:以及之前的內容,但只是[]之間的內容。

那麼,我將如何去寫這個正則表達式呢?是否有可能給出匹配組名稱,以便我知道它匹配的是什麼?

這是一個java項目。

謝謝先進。

+0

像[[這]](即嵌套大括號)的文字會出現在任何地方?如果是這樣,這可能是你不想用正則表達式:) – 2012-07-24 19:27:40

+0

@Steve,不,它不會。 – 2012-07-24 19:30:18

回答

1

如果你足夠確保你的投入,你也許可以使用的東西如/\[(\~|\!|\?)?(?:((?:[^:\]]*?)+):)?([^\]]+?)\]/。 (要翻譯成Java中,你會想逃離反斜槓並使用引號,而不是正斜槓)

+0

很酷。謝謝。現在,當它匹配[〜class:obj]之類的東西時,它會得到1.〜2的類匹配:class:3. obj。在2號上,它捕獲了:你如何省略:?謝謝。 – 2012-07-24 19:39:57

+0

我編輯它以省略冒號:) – 2012-07-24 19:40:35

+0

很酷,非常感謝! – 2012-07-24 19:41:18

1
+0

Rubular(http://rubular.com)在我看來是榜單上的所有人。 – LanguagesNamedAfterCofee 2012-07-24 19:31:52

+0

@LanguagesNamedAfterCofee這是我一直在使用的一段時間。 – 2012-07-24 19:34:22

+0

下面是一個很好地教導正則表達式(與列出的那些網站相反):http://codular.com/regex – LanguagesNamedAfterCofee 2012-07-24 19:35:18

1

我認爲,這應該工作:

/[(.*?)(?:\|(.*?))*]/ 

另外:

[a-z]* 
1

試試這個代碼

final Pattern 
    outerP = Pattern.compile("\\[.*?\\]"), 
    innerP = Pattern.compile("\\[([~!?]?)([^:]*):?(.*)\\]"); 
for (String s : asList(
    "[~class:obj]", 
    "[if][~class:obj]", 
    "[~class|class2|more classes:obj]", 
    "[!class:obj]", 
    "[!class|class2|more classes:obj]", 
    "[?method:class]", 
    "[text]")) 
{ 
    final Matcher outerM = outerP.matcher(s); 
    System.out.println("Input: " + s); 
    while (outerM.find()) { 
    final Matcher m = innerP.matcher(outerM.group()); 
    if (m.matches()) System.out.println(
     m.group(1) + ";" + m.group(2) + ";" + m.group(3)); 
    else System.out.println("No match"); 
    } 
} 
+0

感謝這段代碼,我會對它進行測試。 – 2012-07-24 19:44:45

+0

更新了代碼以清楚地區分單個字符串中單獨的[]塊。我想你會意識到這是解決方案的一個重要方面,而不是僅僅接受一個平坦的匹配序列。 – 2012-07-24 20:05:19

+0

好的,感謝這段代碼,我測試了它,它工作。 – 2012-07-24 20:20:17