【问题标题】:Searching a regex pattern to find "forbidden" characters搜索正则表达式模式以查找“禁止”字符
【发布时间】:2013-06-29 18:43:23
【问题描述】:

我已经用谷歌搜索了很多,但我找不到任何解决方案。 对于学校项目,我需要在字符串中找到不受支持的字符 unsupported chars。 允许的是[A-Z\s]

我发现Pattern.match() 只检查整个 字符串是否与模式匹配。 所以我尝试了这种模式:.*[^A-Z\\s].*

只要字符串中没有任何换行符,它就可以工作。为了检查它们,我也使用了[.\\s]*[^A-Z\\s][.\\s]* 来处理它们,但现在没有任何效果了。

为此目的正确的正则表达式是什么?

【问题讨论】:

    标签: java regex newline regex-negation


    【解决方案1】:

    要么:

    • 只需反转匹配,
    • 或反转字符类并尝试仅找到一个字符:

    [绕过 SO 错误 -- 不能在列表项之后立即引用代码]

    final Pattern p = Pattern.compile("[^A-Z\\s]");
    if (p.matcher(input).find())
        // illegal input, bark
    

    是的,.matches() 命名错误...Java 中的真正正则表达式匹配是使用 .find() 完成的。

    【讨论】:

    • +1 为您的解决方案,但我不同意“Java 中的真正正则表达式匹配是使用“find()”部分完成的。这些只是 Matcher 的两种不同方法。“匹配”尝试为了匹配整个输入的“模式”,“查找”尝试在输入中匹配它。语义...
    • m) 谢谢你的作品。为什么我没有想到这个主意?感谢 .find() 我使用了你的第一个建议。 if (!Pattern.matches("[A-Z\\s]*", inputstr))
    • @Mena 不,不是语义,35 年以上的正则表达式实践。 Python 和 Java 是两种主流的正则表达式语言,它们拒绝承认“正则表达式匹配”的含义。看看有多少人仍然被这个误名弄糊涂了。
    • @fge 我理解你的意思,但Matcherjavadoc 一点也不含糊。
    【解决方案2】:

    试试"(?s).*[^A-Z\\s].*"它会打开dotall模式。在 dotall 模式下,表达式 . 匹配任何字符,包括行终止符。默认情况下,此表达式不匹配行终止符。请参阅 Pattern.API for (?idmsuxU-idmsuxU)

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      相关资源
      最近更新 更多