1

我不是正则表达式方面的专家,但我需要解析一些我无法控制的输入,并确保我过滤掉任何没有 Az 和/或 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)

4

7 回答 7

7

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

于 2011-01-13T14:58:30.730 回答
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."

于 2011-01-13T14:46:59.087 回答
2

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

于 2011-01-13T14:46:24.817 回答
2

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

Martin 提到的第二个潜在问题是,如果您希望字符串仅由字母和数字组成,您可能需要输入开始和结束限定符。

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

^[a-zA-Z0-9]+$

于 2011-01-13T15:01:07.057 回答
1

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

于 2011-01-13T14:47:07.307 回答
1

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

您可以在http://www.regexplanet.com/simple/快速测试您的正则表达式

于 2011-01-13T15:14:02.480 回答
0

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

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

示例代码:

if(e.target.value.match('^[a-zA-Z0-9]*$')){
            console.log('match')
          }
          else{
            console.log('not match')
          }
}

在线工作示例

于 2019-06-19T08:59:36.150 回答