2014-01-13 146 views
0

我想驗證一個字符串只包含某些字和字符。Java檢查字符串只有某些字和字符

我要接受一個字符串,需要檢查它僅包含以下內容:

  • 「(」
  • 「)」
  • 「和」 注意空格
  • 「OR」注意空格
  • 任何整數。如果我可以同時檢查它小於10,那將是一種獎勵,但如果它使代碼複雜化,我可以單獨執行此操作。

如果字符串中有任何其他字符或單詞,我需要拒絕它。

有效的字符串是: (1 OR((2和3)或4,5))

我覺得正則表達式是要要對這個辦法,但我不能工作了如何構建正則表達式來做到這一點。

我知道正則表達式模式是:

  • \(
  • \)
  • \ SOR \ S
  • \砂\ S
  • \ d +

我's已加入他們在一起,所以模式是: 「\ sOR \ s | \ sAND \ s | \ d + | \(| \)」

這顯然起作用,它會找到任何值,但如果字符串中有額外的字符或字符串,則不會拒絕該字符串。

我不必使用正則表達式,但是當我正在學習它們時,這將是一個理想的例子,可以提供一些幫助。 我一直在使用http://www.regexplanet.com/advanced/java/index.html來測試不同的組合,但現在已經承認失敗。

任何幫助表示讚賞。

+2

請注意,正則表達式(通常)只能匹配常規語言。如果你想讓正則表達式檢查匹配的paranethesis,那麼你已經離開了「正規語言國家」:正則表達式不能這樣做。換句話說:你不能識別「(1或(」)作爲非法表達 –

回答

2

您可以用matches()方法一起使用正則表達式的構建提供你逃避所有的\,並允許與+運營商重複出現次數:

boolean happy = testString.matches("(\\sOR\\s|\\sAND\\s|\\d+|\\(|\\))+"); 

我不知道你less than 10的意思,但如果你的意思是這個數字可以是0-9,你可以用\\b\\d\\b代替\\d+。如果您的意思是允許1-9位數字,則可以使用\\b\\d{1,9}\\b

+0

關於「少於10」,你必須檢查數字後面沒有其他數字後面的數字來代替'\\ d +通過'\\ d(?!\\ d)'(或'\\ d \\ b'或'\\ b \\ d')。無需檢查另一端。 –

+0

@Casimir:是的,我只是我認爲添加單詞邊界('\\ b')將以一種乾淨的方式照顧問題 – Keppil

+0

@Keppil感謝您的回覆,匹配似乎有效,所以我會再測試一下。那麼我應該說小於或等於10. 所以1 OR 10是有效的,但1 OR 11不是。我認爲這是不可能的與一個正則表達式。 –

0

我會把你可以接受的字符放在一個常量中。然後把你的測試字符串變成一個字符數組,然後逐個字符地查看它,看看它是否在你的常量中。如果沒有,就吹起來。成功完成=良好的字符串。

我不認爲有一個簡短的方法。

相關問題