2011-04-19 219 views
3

我試圖將我的模式與java上的地址相匹配。無效的正則表達式

String regex = "[a-zA-Z0-9,\\.\']"; 
if(!address.matches(regex)) { 
    //do something 
} 

基本上,我希望能檢測除,.'所有特殊字符。 通過上面的代碼,我的地址

4700基爾街,北約克,ON

當它不應該進入,如果條件。這是爲什麼發生? 你又如何逃脫一個特殊的人物?不應該是\$? Eclipse IDE中會提示一個錯誤,說明

「無效的轉義序列(有效問卷 是\ B \牛逼\ n \˚F\ r \」 \」 \)」

當我做\$\^

回答

0

看看匹配的java文檔()。它會告訴你整個字符串必須與正則表達式匹配才能返回true。你只是想檢查字符串中是否出現某個字符。因此,你應該使用find()。 matches()方法是膚淺的,當寫一個「^ regex $」時,它總是可以被find()替換。

0

matches檢測整個地址字符串是否匹配表達式。而你的表情只能由一個字符匹配。在正則表達式的末尾添加一個+以匹配一個或幾個接受的字符。

1

試試這個。

[a-zA-z0-9,'\\.\s] 

您還需要匹配空格。您的表達式不包含空格,因此地址不匹配。

1

在你的模式有幾個誤區:

  • 你需要能匹配一個空格字符,這是不是在你允許的字符列表。

  • 你需要附加一個*或+來允許一個字符序列 - 現在你只是要求匹配1出現列表中的一個元素。

所以你想要[a-zA-Z0-9\\ ,]之類的東西,以及其他任何你想允許的轉義字符。

3

我不相信你需要逃脫一個集合中的大多數字符。前面已經提到,你要包括空間和捕獲1或更多的人以 '+':

String regex = "[a-zA-Z0-9,.' ]+"; 
0

編輯:從錯誤,pythonicalcorrectus-javonian改變。 ..

問題的解決方案是找到一個無效字符。如果:[a-zA-Z0-9,\\.' ]匹配有效的字符,則:[^a-zA-Z0-9,\\.' ]與無效字符匹配。如果我們可以找到其中的一個,那麼該字符串是無效的 - 否則整個字符串是有效的。這裏有一個測試腳本:

import java.util.regex.*; 
public class TEST { 
    public static void main(String[] args) { 
     String s = "Test string with no invalid characters."; 
     // Match just one non-valid character. 
     String re = "[^a-zA-Z0-9,\\.' ]"; 
     Pattern p = Pattern.compile(re); 
     Matcher m = p.matcher(s); 
     if (m.find()) { 
      System.out.println("Invalid char found."); 
     } else { 
      System.out.println("No invalid char found."); 
     } 
    } 
} 
+0

你確定你正在尋找正確的問題?這個標籤是'java',而不是'python'。 – 2011-04-20 05:12:26

+0

@Alan:你說得對。 D'哦!回到(Java)繪圖板...(並且謝謝!) – ridgerunner 2011-04-20 05:33:09