2017-02-26 52 views
-1

我想一個Java模式相匹配的一系列非空白字符,接着或由一系列空白字符的否,接着是對含有任何與此代碼中括號的:Java模式這些模式匹配有什麼問題?

 Pattern p1 = Pattern.compile("[^\\s+][\\s*]\\({1}[.*]\\){1}"); 

然而,當我試圖將它與「a(a)」匹配,返回false。

也許類似的問題:

兩個網站由空格saparated:

非空白字符標點符號或存在於下面的代碼(例如字的某些列表分離的
Pattern p4 = Pattern.compile("([^\\s+]([\\.]{1}[^\\s+])+)[\\s+]([^\\s+]([\\.]{1}[^\\s+])+)"); 

兩個字符串,或者又名...)(它可以從單詞列表開始)。

Pattern p2 = Pattern.compile(
      "([^\\s+][\\s+])?([and|or|aka|&|Related to|moved from|now|formerly|and by the same host|and any address starting with]{1}[\\s+][^\\s+])+"); 


Pattern p3 = Pattern.compile("[^\\s]+[\\s*][,|&|;|\\s+/|/\\s+]{1}[\\s*][^\\s+]"); 

回答

0

我想讀在Java中docs on patterns可能會有所幫助

特別的問題是,你把+*到錯誤的地方,但我想原因是,你有什麼不明白[something]手段。以下代碼

Pattern p1 = Pattern.compile("[^\\s]+[\\s]*\\({1}.*\\){1}"); 
    //Pattern p1 = Pattern.compile("[^\\s]+[\\s]*\\(.*\\)"); //simplified same pattern 
    String t = "a (a)"; 
    Matcher matcher = p1.matcher(t); 
    System.out.println(matcher.matches()); 

打印爲真。

0

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

會做你想要什麼。將括號內的字符類以外的星號和加號移動。 {1}的兩個實例都不做任何事情。沒有其他量詞,令牌重複一次,最後[.*]在這兩個字符的字面意思是permit one of these two characters

[test]意思是t,e或s中的一個。第二個t是無關緊要的。字符類中的大多數字符意味着它們的字面意義,但是例外涉及比在S/O答案中應該做更多的解釋。

不是說雖然這會成功說a (b),但如果你有兩個匹配在同一個句子中並且通常只是一個雜亂的表達式,這將會帶來意想不到的結果。

對於一個現實的表達式,您需要提供逼真的樣本數據。

一種特殊的資源,學習基礎知識後,是像http://regex101.com與語法高亮,搭配高亮,比賽擊穿,並提示在令牌鼠標懸停網站提供的實時測試環境,它是採取第二個步驟的好方法。雖然它只支持少數(常用)風格,但大多數成熟的編程/腳本語言在正則表達式中共享相同的基本/中間功能。