【问题标题】:Java - Unknown characters passing as [a-zA-z0-9]*?Java - 作为 [a-zA-z0-9]* 传递的未知字符?
【发布时间】:2011-06-08 13:16:22
【问题描述】:

我不是正则表达式方面的专家,但我需要解析一些我无法控制的输入,并确保过滤掉所有没有 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 是红色矩形):

如果您想知道,它也会显示文本,但并非都是这样。

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

请帮忙。

[EDIT] 据我从(非常大的)输入中可以看出,[?] 要么是空格要么什么都没有;也许有某种编码问题,也可能与#text节点有关(输入是xml)

【问题讨论】:

  • 你为什么不用\w来表示ASCII字母、ASCII数字或下划线?当然,如果这不是 7 位数据,则​​需要使用 \pL 之类的属性。
  • 如果我使用 .matches("\\w"),同时包含文本和 [?] 的结果将不会显示。即“ImportantText[?]”将被过滤掉。
  • 你是 100% ??? 字符通过正则表达式吗?它们不是字符集修饰或其他字符串/变量之类的副作用吗?你现在在那里的正则表达式不应该传递特殊字符,除非还有其他事情发生......

标签: java regex spaces alphanumeric


【解决方案1】:

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

【讨论】:

  • 对不起各位,但是 ^[a-zA-Z0-9]*$ 和 [a-zA-Z0-9]* 都没有解决这个问题。感谢您指出错字。
  • 你试过否定匹配吗? ^[^a-zA-Z0-9]*$ - 看看这是否会给你想要的结果 - 当且仅当字符串中有非法字符时才会匹配;)
  • 当且仅当字符串中有 only 个非法字符时,否定才会匹配。我认为您追求的是[^a-zA-Z0-9]+,它将匹配非法结果...
【解决方案2】:

您的正则表达式中有一个错误:应该是 [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."

【讨论】:

  • 如果 OP 对字符类没问题,\w 可以用来避免这个鬼鬼祟祟的问题(尽管我认为这会将_ 添加到可接受的字符中,这可能不适用于问题手 - 不太确定)。
  • 对不起各位,但是 ^[a-zA-Z0-9]*$ 和 [a-zA-Z0-9]* 都没有解决这个问题。感谢您指出错字。
  • @twodordan 你有什么意见?同样在您的代码中确保显示您匹配的内容,因为现在您正在显示另一个变量(gottenData 与 someData)。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 谢谢你,马克!不确定最初的 .* 做什么,但是 "^[a-zA-Z0-9]+.*$" 对我的输入具有相同的结果,并且根据您所说的应该更快。
    • @mark 您可以在使用 Matcher().matches() 时使用最后一个不带^.*$ 的正则表达式,并且仅当整个字符串匹配时才会匹配。顺便说一句 .. 不错 * vs +:)。
    • 呃,您对问题的描述不正确。由于正则表达式锚定在两端(分别使用^$ 定位到字符串的开头和结尾),^[a-zA-Z0-9]*$ 将只匹配完全由 alnum 字符和空字符串组成的字符串。但它不会匹配包含任何非数字字符的非空字符串。在这种情况下,*+ 之间的唯一区别是它是否匹配空字符串。 (对不起,我才意识到问题被编辑了。但是在查看编辑时仍然不正确)...
    • 开头的 .*(.* 表示“匹配零个或多个任何内容”)将匹配任何前导(非字母数字)字符。如果你的输入以字母或数字开头,没有它你会匹配得很好,但如果你以其他东西开头,匹配就会失败。
    • @ircmaxell - 你当然是正确的。当我回答时,我可以发誓那些不在正则表达式中,也许是因为我还没有喝咖啡。话虽如此,OP希望捕获任何包含字母数字的字符串,而不考虑非字母数字字符。这肯定需要在 char 类上使用 + 和一些可以吃非字母数字字符的东西。
    【解决方案5】:

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

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

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

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

    【讨论】:

    • 感谢您的回复,但您的建议会过滤掉诸如“ImportantText[?]”之类的字符串。 Mark Tozzi 似乎解决了我的问题
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

      如果你的值只包含 numberString 而不是它的显示 ma​​tch 即 riz99, riz99z 否则它将显示不匹配,即 99z.、riz99.z、riz99.9

      示例代码:

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

      online working example

      【讨论】:

        猜你喜欢
        • 2015-01-07
        • 2021-11-09
        • 2011-11-09
        • 2010-12-11
        • 2019-05-03
        • 2015-02-08
        • 2012-05-15
        • 2012-03-26
        • 1970-01-01
        相关资源
        最近更新 更多