2011-04-19 135 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