2013-04-30 142 views
2

如何爲「空字符串」或「創建的新條目」指定正則表達式模式是一個子字符串「?如何將模式與完整的字符串進行匹配?

我上的圖案試圖(new entry created|)Matcher.find()爲真像輸入:

無效水平

有效電平的範圍爲0-14

」。

這是做直接的編程一樣

String.isEmpty() || String.contains("new entry created") 

,因爲同樣的方法會有不同的圖案作爲輸入的選項。換句話說,我需要在這種情況下使用正則表達式。 我想堅持使用Matcher.find(),因爲我會使用其他錯誤模式 - 例如「無效」。

+0

http://stackoverflow.com/a/3164471/738746 – 2013-04-30 03:07:44

+0

豈不'String.contains( 「new entry created」)'如果'new entry created'是'String'的一個子串,那麼它也匹配嗎? – 2013-04-30 08:02:54

+0

@TimPietzcker匹配一個子字符串很好 – likejiujitsu 2013-04-30 14:40:12

回答

1

如果您的要求實際上是要麼

  • 包含new entry created
  • 一個字符串匹配一個空字符串

那麼你可以使用

^(?:.*new entry created.*)?$ 

或者(如果你的字符串可能包含換行符)

(?s)^(?:.*new entry created.*)?$ 

在Java中,你有.matches()方法,你可以刪除錨點:

Pattern regex = Pattern.compile("(?:.*new entry created.*)?", Pattern.DOTALL); 
Matcher regexMatcher = regex.matcher(subjectString); 
foundMatch = regexMatcher.matches(); 
+0

當你說,「如果你的字符串可能包含換行符」,我假設你的意思是輸入字符串;是的,輸入字符串包含換行符。但只要「新入門」在一條線上,它是否仍然重要? – likejiujitsu 2013-04-30 21:14:34

+0

我測試了這一點,它的工作。 – likejiujitsu 2013-05-03 22:54:14

+0

@likejiujitsu:我不知何故錯過了你之前的問題。是的,這很重要;如果沒有'(?s)'(或'Pattern.DOTALL'),點('.')將不匹配換行符,導致匹配失敗。 – 2013-05-04 06:43:55

3

您只需將「空」部分包圍與開始年底分隔符,以您的搜索限制在輸入的準確匹配:

(new entry created|^$) 
+0

好...我從來不知道我們可以這樣做... – Buddha 2013-04-30 03:12:37

+0

@Vulcan匹配一個子字符串很好 – likejiujitsu 2013-04-30 14:41:48

+0

@likejiujitsu糟糕,我誤解了這個要求。編輯答案。 – Vulcan 2013-04-30 15:10:15

1

您好嘗試這種模式...

(new entry created)|(^$) 

我已經測試此代碼

public static void main(String[] argv) { 
    String pattern = "(new entry created)|(^$)"; 
    String input = ""; 
    Pattern p = Pattern.compile(pattern); 
    boolean found = p.matcher(input).lookingAt(); 
    System.out.println("'" + pattern + "'" 
      + (found ? " matches '" : " doesn't match '") + input + "'"); 
} 
+0

正則表達式似乎是正確的,但你應該堅持'find()'方法。它允許匹配發生在字符串中的任何地方(這是OP似乎想要的),而'lookingAt()'將匹配錨定到字符串的開頭。事實上,我建議你從不*使用'lookingAt()'。與明確的錨點相比,它沒有增加真正的價值,而且它很少被使用,所以每次重新訪問代碼時都可能需要查看它。 :D – 2013-04-30 15:50:31

+0

感謝您的建議,但我剛剛從我的一些舊練習代碼複製來測試我的正則表達式是否工作。順便說一句,這個明確的錨點是什麼?從來沒有聽說過。 – Buddha 2013-04-30 17:30:33

+0

我正在討論在正則表達式中使用錨(例如'^ ... $'或'\ A ... \ Z'),而不是依賴*應用正則表達式來錨定它的方法。事實上,我建議您始終使用錨點,無論您使用哪種方法。這樣,任何試圖瞭解正則表達式的人都會在一個地方找到他們需要的所有信息:正則表達式本身。當然還有修飾符標誌,但其中大部分可以以內聯修飾符的形式移動到正則表達式中,例如, '(?m)'或'(?i)'。 – 2013-04-30 19:49:52

2

您的模式很好(對於Java),只需使用Matcher.matches()而不是Matcher.find()

Class Matcher documentation

  • matches方法試圖匹配針對圖案的整個輸入序列。

  • lookingAt方法嘗試從輸入序列開始匹配模式。

  • find方法掃描輸入序列,尋找與模式匹配的下一個子序列。

所以,問題是,find方法將在任何字符串中找到您的空字符串替代。要在Java中查找完全匹配,請使用matches()方法。

+0

一個更好的正則表達式會是'(創建新條目)'(或'(?:新創建的條目)'),這使得「全部或全部」要求更加明確。 – 2013-04-30 08:01:31

+0

@stema我更喜歡使用find(),因爲我的字符串可能是一個子字符串。 – likejiujitsu 2013-04-30 21:18:01