2011-08-27 49 views
0

我試圖通過Java中的正則表達式過濾器,只允許特定的詞,即:排除在Java正則表達式正斜槓話

Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\.-_]{1," + s.length() + "}$"); 

但我發現它允許通過,因爲斜槓ISN140公里每小時沒有處理。理想情況下,這個詞不應該被允許。

任何人都可以提出修復我當前的版本?

我是新來的正則表達式,並沒有特別關注它。

的正則表達式是在utils的類方法如下:

public static boolean checkStringAlphaNumericChars(String s) { 
    s = s.trim(); 
    if ((s == null) || (s.equals(""))) { 
     return false; 
    } 

    Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\.-_]{1," + s.length() + "}$"); 
    // Pattern p = Pattern.compile("^[a-zA-Z0-9_\\s]{1," + s.length() + "}"); 
    Matcher m = p.matcher(s); 
    if (m.matches()) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

我想允許使用下劃線,空間,時間減字符串。並確保接受字母數字如123.45或-500.00的字符串被接受,但其中5,000.00不被接受。

+0

真的沒有必要爲此:'{1, 「+ s.length()+」}' – NullUserException

+0

那麼,什麼可能取代它,以保證字符串的每個字符正確解析? –

+0

你在逃避什麼?你使用'\ w'不是什麼?你在指定什麼?{1,'?你爲什麼使用從點到下劃線**的所有代碼點的範圍來指定那些* 49 *代碼點?你爲什麼使用代碼數*單位*來指定代碼*點*?這些數字不匹配時你會做什麼? &C&C&C&C&C&死!你想用簡單的英語來做什麼,因爲我們永遠不會從你的困境中想出來? – tchrist

回答

1

你可以使用

public static boolean checkStringAlphaNumericChars(String s) { 
    return (s != null) && s.matches("[\\w\\s.-]+"); 
} 
  • 短路空檢查,確保snull當您嘗試對其執行.matches()時。使用\w查找字母數字加下劃線。 tchrist也將是第一個指出這是比[A-Za-z0-9_]
  • +在最後,確保你至少有一個性格比較正確的(即:字符串不爲空)
  • 沒有必要使用^$,因爲.matches()會嘗試將模式與整個字符串進行匹配。
  • 也不需要在字符類中跳過點(.)。

新演示:http://ideone.com/qraob

+0

這很好。但是是否可以擴展到包含fitzwilliam-smythe這樣的雙筒名稱或5000.00是5000.00的雙筒名稱? –

+0

@Mr這已經匹配'fitzwilliam-smythe',如果你想允許逗號,你可以在字符類中加入逗號(例如:'[\\ w \\ s。, - ] +')。 – NullUserException

+0

要檢查逗號是否被用作千位分隔符,只有接受它纔會給正則表達式IMO增加不必要的複雜性,但可以完成。 – NullUserException

4

是因爲連字符是第二個到最後你的字符集,因此被定義爲'_'範圍從'.',其中包括'/'

試試這個:

Pattern p = Pattern.compile("^[a-zA-Z0-9\\s\\._-]$"); 

此外,NullUserException是正確的,沒有必要{1," + s.length() + "}。你用'^'開始表達並用'$'結束它的事實將確保整個字符串被消耗。

最後,你可以利用\w作爲替代[a-zA-Z_0-9],簡化你的表達"^[\\w\\s\\.-]$"

+0

我覺得奇怪的是,如果我刪除{1,「+ s.length()+」},以前有效的字符串現在正在拒絕。 –

+0

如果您發現'[^ \ w \ s .-]',它會使字符串失效。 – tchrist

+0

@ Morgan Morgan - 不要簡單地將其刪除,用'+'替換它。 – erickson