Java - 传递为[a-zA-z0-9] *的未知字符?

时间:2011-01-13 14:44:17

标签: java regex spaces alphanumeric

我不是正则表达式的专家,但我需要解析一些我无法控制的输入,并确保我过滤掉任何没有A-z和/或0-9的字符串。

当我运行时,

Pattern p = Pattern.compile("^[a-zA-Z0-9]*$"); //fixed typo
if(!p.matcher(gottenData).matches())
       System.out.println(someData); //someData contains gottenData

某些空格+一个未知的符号以某种方式滑过过滤器(gottenData是红色矩形):  screenshot

如果你想知道,它也会显示文字,它不是那样的。

现在,我不介意[?],只要它还包含一些字符串。

请帮忙。

[编辑]据我所知(非常大)输入,[?]是白色空格要么根本没有;也许存在某种编码问题,也许与#text节点有关(输入是xml)

7 个答案:

答案 0 :(得分:6)

*量词匹配“零或更多”,这意味着它将匹配不包含类中任何字符的字符串。尝试+量词,这意味着“一个或多个”:^[a-zA-Z0-9]+$将仅匹配由字母数字字符组成的字符串。 ^.*[a-zA-Z0-9]+.*$将匹配包含一个或多个字母数字字符的任何字符串,但前导。*会使速度慢得多。如果您使用Matcher.lookingAt()代替Matcher.matches,则不需要完整的字符串匹配,您可以使用正则表达式[a-zA-Z0-9]+

答案 1 :(得分:4)

你的正则表达式中有错误:而不是[a-zA-z0-9]*它应该是[a-zA-Z0-9]*

正则表达式周围不需要^$Matcher.matches()始终匹配完整的字符串。

String gottenData = "a ";
Pattern p = Pattern.compile("[a-zA-z0-9]*");
if (!p.matcher(gottenData).matches())
    System.out.println("doesn't match.");

这会打印"doesn't match."

答案 2 :(得分:2)

您必须将正则表达式更改为"^[a-zA-Z0-9]*$"以确保您匹配整个字符串

答案 3 :(得分:2)

正确答案是上述答案的组合。首先,我想你想要的角色匹配是[a-zA-Z0-9]。注意,Az并不像你想象的那样糟糕,它包括A和z之间的ASCII范围内的所有字符,即字母加上一些额外的字符(特别是[,\,],^,_,`)。

马丁提到的第二个潜在问题是,如果你希望字符串只包含字母和数字,你可能需要输入开始和结束限定词。

最后你使用*运算符,这意味着0或更多,因此你可以匹配0个字符,匹配将返回true,所以你的模式将有效地匹配任何输入。你需要的是+量词。因此,我将提交您最有可能寻找的模式:

^ [A-ZA-Z0-9] + $

答案 4 :(得分:1)

看起来它应该是“a-zA-Z0-9”,而不是“a-zA-z0-9”,请尝试更正......

答案 5 :(得分:1)

是否有人考虑为正则表达式[a-zA-Z0-9 ]*添加空间。这应该匹配任何带有字符,数字和空格的普通文本。如果你想要引号和其他特殊字符也将它们添加到正则表达式中。

您可以在http://www.regexplanet.com/simple/

快速测试正则表达式

答案 6 :(得分:0)

您可以检查输入值是否包含字符串和数字?通过使用正则表达式 ^ [a-zA-Z0-9] * $

如果您的值仅包含numberString而不是其显示 match ,即riz99,riz99z 否则它将显示不匹配,即99z。,riz99.z,riz99.9

示例代码:

locales

online working example