2011-10-13 51 views
2

我是一個Java用戶,但我是新來的正則表達式。正則表達式匹配「字典單詞」

我只想給出一個小表達式,給定一個單詞(我們假設該字符串只有一個單詞),用布爾值來回答,告訴單詞是否有效。

一個例子...我想要捕捉字典中所有可能的單詞...所以,我只是想從字母az AZ,連字符(例如:man-in-the-中間)和一個撇號(就像我會或蒂芙尼的)。

有效的話:

  • "food"
  • "RocKet"
  • "man-in-the-middle"
  • "kahsdkjhsakdhakjsd"
  • "JESUS"

非有效字:

我使用此代碼,但它不會給正確答案:

Pattern p = Pattern.compile("[A-Za-z&-&']"); 
Matcher m = p.matcher(s); 
System.out.println(m.matches()); 

我的正則表達式有什麼問題?

+1

是不是有點天真(也許甚至blasé)假定單詞只包含ASCII字母? –

+1

取決於語言(他所說的一個,而不是代碼):)我認爲,只要你只是代碼的樂趣,沒有問題。 – Sibbo

+0

Area-51? Deadmau5? – fredley

回答

4
  • 添加+表達後說:「這些字符的一個或多個」:
  • 逃生與\連字符(或把它放在最後)。
  • 刪除那些&字符:

下面的代碼:

Pattern p = Pattern.compile("[A-Za-z'-]+"); 
Matcher m = p.matcher(s); 
System.out.println(m.matches()); 

完整的測試:(不產生輸出)

String[] ok = {"food","RocKet","man-in-the-middle","kahsdkjhsakdhakjsd","JESUS"}; 
String[] notOk = {"gipsy76", "www.google.com", "[email protected]", "745474","+-x/" }; 

Pattern p = Pattern.compile("[A-Za-z'-]+"); 

for (String shouldMatch : ok) 
    if (!p.matcher(shouldMatch).matches()) 
     System.out.println("Error on: " + shouldMatch); 

for (String shouldNotMatch : notOk) 
    if (p.matcher(shouldNotMatch).matches()) 
     System.out.println("Error on: " + shouldNotMatch); 

+0

爲什麼你使用'在你的正則表達式的結尾? – Sibbo

+0

它應該匹配例如''蒂芙尼的''' – aioobe

+0

哦,重讀它 – Sibbo

1

這應該工作:

"[A-Za-z'-]+"

+0

請注意,使用'*'它匹配空字符串,''「'這可能不是一個可能出現在字典中的單詞;) – aioobe

+0

現在它確實;-) – Sibbo

+0

感謝您的guick和(一如既往)正確回答:) – nunoaac

-1

喜Aloob請與此檢查,有點冗長,可能具有這種較短的版本,還是......

[A-z]*||[[A-z]*[-]*]*||[[A-z]*[-]*[']*]* 
+0

你爲什麼這樣做? – Sibbo

+0

你能解釋一下你的意思嗎(這顯然不是一個有效/正常的表達式)?什麼是所有的雙斜線,雙管,嵌套括號等?你覺得'[A-Z]'做什麼? –

+0

@TimPietzcker好吧,我只是想得到它,我爲這個答案道歉。它爲我工作,爲什麼我只是粘貼它。 [A-Z]表示它會比較兩個大寫字母。水管意味着'或'。對不起...... – Jithu

0

但是「-word」和「word-」無效。所以,你可以使用這個模式:

WORD_EXP = "^[A-Za-z]+(-[A-Za-z]+)*$" 
0

正則表達式 -/^(?[A-ZA-Z] *(「| - )[A-ZA-Z] +)*/

如果你不想連續使用「'」或「 - 」,你可以使用上面的正則表達式。 它會給你準確的匹配你的文字。 它接受 人在這方面的中間人 asd'asdasd'asd

它拒絕以下字符串 男人 - 在 - midle asdasd''asd