2013-04-09 102 views
1

匹配「>」或「|」模式的適當正則表達式是什麼?像下面的例子那樣至少有三次出現?我想匹配「>」或「|」 (不是兩個)在給定的文本之間不規則的間距。匹配「a> b> c」模式的正則表達式?

應該匹配

  • 「A> B> C> d> e」 的

  • 「A | B | C | d | E」

不應該比賽

  • 「a> b> c」(only 2「>」)

  • 「a | b> c | d | E」(也不 「>」 或 「|」)

示例Java代碼來測試表達式 (僅反斜槓轉義)

public static void main(String[] args) { 
    List<String> patterns = new ArrayList<String>(); 
    patterns.add("/((\\s*\\w+\\s*>\\s*){3,}|(\\s*\\w+s*\\|\\s*){3,})\\w/g"); 
    patterns.add("^(([\\w\\s]*>){3,} | ([\\w\\s]*\\|){3,})[\\w\\s]*$"); 
    patterns.add("/(>|\\|)[^>\\|]*\\1[^>\\|]*\\1/"); 
    patterns.add("/[\\w ]*([>|])(?:[\\w ]*\\1){2,}[\\w ]*/"); 

    List<String> test = new ArrayList<String>(); 
    test.add("a > b > c > d"); 
    test.add("a >b> c> d"); 
    test.add("a>b>c>d"); 
    test.add("a>b>c"); 

    for (String s : test) { 
     for (int i = 0; i < patterns.size(); i++) { 
      System.out.println(s + "[Pattern " + i + "] " + s.matches(patterns.get(i))); 
     } 
    } 
} 
+0

你需要捕獲組嗎?他們需要在兩者之間有角色嗎? – 2013-04-09 09:53:01

+0

捕獲組是一件好事。除了空格之外,沒有任何字符,我可以保證 – 2013-04-09 09:57:05

+0

這個「a> b> c> d> e」在兩個字符之間有字符。你說只會有空格? – 2013-04-09 09:58:19

回答

1
/(\s*\w+\s*([>\|])\s*)(\s*\w+\s*\2\s*){2,}\w*/ 

這工作假設你需要(之間或更多|或>符號)的字符 - 符號不能在有適用於它的正則表達式的行任何方式混合。當然,處理不規則的間距。完整的小組也被捕獲。

乾杯。

+1

我發現'^(([\ w \ s] *>){3,} |([\ w \ s] * \ | ){3,})[\ w \ s] * $'看起來更清潔。 – Chrono 2013-04-09 10:00:29

+1

@Willem我也是,但並不等同。我會盡量讓我的更好。歡呼聲 – 2013-04-09 10:02:54

+0

@ d'alar'cop我需要在java中測試時刪除任何東西嗎? – 2013-04-09 10:21:49

0

你可以嘗試分組和回到引用

/(>|\|)[^>\|]*\1[^>\|]*\1/ 
+0

在http://regexpal.com/上測試它是否是一個好主意,它似乎不匹配「a> b> c> d」? – 2013-04-09 09:52:46

+0

@OnurGunduru它使用javascript語法,刪除開始和結尾'/',並檢查 – 2013-04-09 10:08:47

1
/[\w ]*([>|])(?:[\w ]*\1){2,}[\w ]*/ 

匹配一個>或|,然後確保它出現TWI更多(至少)。

0

了幾個測試後,我決定用這個表達式:

((\\s)*(\\w)+((\\s)+(\\w)+)*(\\s)*((>)(\\s)*(\\w)+((\\s)+(\\w)+)*(\\s)*){3,})|((\\s)*(\\w)+((\\s)+(\\w)+)*(\\s)*((|)(\\s)*(\\w)+((\\s)+(\\w)+)*(\\s)*){3,}) 

所有這些測試案例匹配:

test.add(" a > bbb > ccc > dc");//true 
    test.add("a > b > c > d");//true 
    test.add("a >b> c> d");//true 
    test.add("a>b>c>d");//true 
    test.add("a>b>c");//false 
    test.add("a>b>c| d >e >f");//false 
    test.add(">a>b>c> d >e >f");//false 
    test.add("<a>b>c> d >e >f");//false 
    test.add("a>b>c<d>e >f");//false 
    test.add("a>b>c> d >e >f>");//false 
    test.add("a b>b>c d > d >e >f> a bcd");//true, 
    test.add("ayse ciog > ayse ciog > ayse ciog > ayse ciog");//true 

而且現在越來越全成結果,thanx您的幫助。

+0

嘿,哥們。由於這似乎是我提供的正則表達式的一種形式 - 你認爲你可以打勾或者至少大拇指答案? (就像SO上的禮儀) – 2013-04-09 11:49:31

+0

我點擊標記正確的答案,但它說:「你可以在2天內接受你自己的答案」。我必須做什麼? – 2013-04-09 11:55:13

+0

你應該接受我的朋友......或者至少大拇指 - 實際上通常不會有人回答他們自己的問題,除非沒有發佈合適的答案。你的答案是_is_我的答案的Java版本 - 這是通用的正則表達式(這就是問題要求) – 2013-04-09 11:57:28