我不是正则表达式的专家,但我需要解析一些我无法控制的输入,并确保我过滤掉任何没有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是红色矩形):
如果你想知道,它也会显示文字,它不是那样的。
现在,我不介意[?],只要它还包含一些字符串。
请帮忙。
[编辑]据我所知(非常大)输入,[?]是白色空格要么根本没有;也许存在某种编码问题,也许与#text节点有关(输入是xml)
答案 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 ]*
添加空间。这应该匹配任何带有字符,数字和空格的普通文本。如果你想要引号和其他特殊字符也将它们添加到正则表达式中。
答案 6 :(得分:0)
您可以检查输入值是否包含字符串和数字?通过使用正则表达式 ^ [a-zA-Z0-9] * $
如果您的值仅包含numberString而不是其显示 match ,即riz99,riz99z 否则它将显示不匹配,即99z。,riz99.z,riz99.9
示例代码:
locales