2015-10-17 66 views
3

我需要一個正則表達式模式,它將成功用於字符串​​,但不適用於字符串.*。我發現這個棘手。我期望[^.]\\*[^\\.]\\*(?<!\\.)\\*工作,但沒有一個這樣做。匹配星而不是星星

任何想法?

@Test 
public void testTemp() { 
    String regex = "[^.][*]"; 
    if ("s*".matches(regex)) { 
     if (".*".matches(regex)) { 
      System.out.println("Success"); 
     } else { 
      // This exception gets thrown. 
      throw new RuntimeException("Wrongly matches dot star"); 
     } 
    } else { 
     throw new RuntimeException("Does not match star"); 
    } 
} 

請不要告訴我,我的用例是愚蠢的。我有一個完全合法的用例,它有點難以清晰地表達。我只想說,我並不困惑。

+0

這將是最好的總是描述你的實際使用情況,以避免陷阱的[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-問題)。 –

+0

好點。這很困難,但基本上我在一個文件中有一個巨大的正則表達式,我試圖匹配從某個服務器返回的JSON響應。我需要「。*」來忽略某些非確定性的部分。但'*'可能出現在服務器響應中。 –

+0

請說明它應該匹配什麼類型的樣本,哪些不應該。如果你只是需要它匹配「s *」,只需使用「s \\ *」正則表達式:) –

回答

2

的模式是正確的,只是你的第二個if說法是錯誤的嘗試這個

@Test 
public void testTemp() { 
    String regex = "[^.][*]"; 
    if ("s*".matches(regex)) { 
     if (!".*".matches(regex)) { 
      System.out.println("Success"); 
     } else { 
      // This exception gets thrown. 
      throw new RuntimeException("Wrongly matches dot star"); 
     } 
    } else { 
     throw new RuntimeException("Does not match star"); 
    } 
} 
+0

是的,這是有效的。 –

+0

愉快回答。 –

3

您的代碼的問題在於它與非點字符匹配。您應該使用negative lookbehind代替:

(?<![.])[*] 

Regex101 demo.

Pattern regex = Pattern.compile("(?<![.])[*]"); 
if (regex.matcher("s*").find()) { 
    if (!regex.matcher(".*").find()) { 
     System.out.println("Success"); 
    } else { 
     // This exception gets thrown. 
     throw new RuntimeException("Wrongly matches dot star"); 
    } 
} else { 
    throw new RuntimeException("Does not match star"); 
} 

Java demo.

+0

我試過這個,但奇怪的是它不起作用。我期待着它。 –

+0

因爲你的if語句是錯誤的。 – Andreas

+0

不過,我得到''不匹配我想匹配的東西'' –

2

你的意思if (! ".*".matches(regex)) {