【问题标题】:Why does Java-regex matches underscore? [duplicate]为什么 Java-regex 匹配下划线? [复制]
【发布时间】:2020-10-18 22:28:03
【问题描述】:

我第一次尝试使用^([^\\W_]+.)([^\\W_]+.)$ 为任意数量的string. 匹配URL 模式string.string.,它适用于匹配两个连续的模式。但是,当我将其概括为^([^\\W_]+.)+$ 时,它会停止工作并匹配错误的模式“string.str_ing.”。 你知道第二个版本有什么问题吗?

【问题讨论】:

  • 请转义.,因为它是一个元字符。
  • \w 也包含下划线。此外,由于几年前 URL 可能包含 Unicode 字母。

标签: java regex url


【解决方案1】:

[^\W] 似乎是一个奇怪的选择 - 它匹配'not not-a-word-character'。还没想好,不过听起来就相当于\w,即匹配一个单词字符。

无论哪种方式,使用 ^\W 和 \w,您都要求匹配下划线 - 这就是它匹配带有下划线的字符串的原因。 “单词字符”是大写字母、小写字母、数字、和下划线

你可能想要 [a-z]+ 或者 [A-Za-z0-9]+

【讨论】:

  • 不,它没有。 [] 的内容表示除 / 之外的任何内容(//)。 \W(它应该是\w)不能作为[a-zA-Z0-9_] 的快捷方式,因为最初的两个反斜杠(\`) have own meaning and the W/w` 字符保持未转义。这三个应该包含在生效(和小写的w)。
  • 在给定的正则表达式中没有斜杠,只有反斜杠。我假设 \\ 只是单个 \ 的 Java 源语法。否则表达式就很奇怪 - [^\\W_]+ 匹配除反斜杠、W 和下划线之外的字符串。这很可能给出了看到的结果,但它似乎不是一个有用的解析,我怀疑它是有意的。
【解决方案2】:

你需要逃避你的 .字符,否则它将匹配任何字符,包括_。

^([^\\W_]+\.?)+$

这可以是您的通用正则表达式

【讨论】:

    【解决方案3】:

    使用^([^\\W_]+.)([^\\W_]+.)$,您可以匹配任意两个带有受限字符集的单词。虽然,您没有转义 .,但只要第一个单词首先匹配 string,然后是任何文字(这就是未转义的 . 的含义),然后再次匹配 string,它仍然有效。

    在后一种中,未转义的点 (.) 是捕获组的一部分,至少出现一次(因为您使用 +),因此它允许任何字符作为 除数 .也就是说string.str_ing.被理解为:

    • string 作为第一个字
    • str 作为第二个字
    • ing 作为第三个字

    ...只要未转义的点 (.) 允许任何除数(. 字面意思和 _)。

    转义点以使正则表达式按预期工作 (demo):

    ^([^\\W_]+\.)+$
    

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多