【问题标题】:Conforming a Regex that matches the following patterns?符合与以下模式匹配的正则表达式?
【发布时间】:2009-11-05 08:49:18
【问题描述】:

我在 URL 中有以下模式。

  1. 约翰·史密斯
  2. 约翰.史密斯.1
  3. 约翰·艾尔-史密斯
  4. John.al-smith.1
  5. John.Smith.Al-Caboon

如果第一个 (.) 是强制性的,并且在第一个 (.) 前后至少有一个字符,则其余内容(数字、连字符和第二个 (.))是可选的。
我创建了以下正则表达式:

^\w+.\w+-*\w*.?\d*\w*-*\w*

虽然它成功匹配了上述所有模式,但它也匹配了一些不需要的模式,例如:

  1. “login”(没有强制性的第一个点)
  2. “users/john”(带有不想要的 / 并且没有强制性的第一个点)
  3. “1234”(无效,模式必须以字符开头)

我在这里做错了什么?

【问题讨论】:

  • 你如何定义角色? J1hn.Smith 有效吗?
  • 你应该用反斜杠转义点。现在它是一个通配符,这可以解释为什么一些不需要的字符串也匹配模式。
  • @Dominic yeh、j1hn.smithy 和 1jhn.smith 将是有效的。

标签: regex


【解决方案1】:

你的正则表达式观察到的问题

  1. “。”是正则表达式中的元字符。它匹配“任何东西”。您应该转义它以匹配点。像这样:\.
  2. \w 是一个字符类,包括小写字母、大写字母、数字和下划线。这就解释了为什么“1234”通过了。

试试这个

^[a-zA-Z]\w*(\.[-\w]+){1,2}$

【讨论】:

  • 只是一个小问题:大多数正则表达式实现不会让 DOT 匹配 \r\n,除非启用了 DOT-ALL 选项 (?s)
  • 感谢您的解释,但您的正则表达式与上述任何模式都不匹配!
  • @7alwagy 不确定您的意思?我在 regexpal.com 上试过,它确实完美匹配。你喜欢把这个列表放在一个文件中,然后逐一搜索以匹配它们吗?那么你可能应该摆脱 ^,$
  • 您的正则表达式不匹配类似 (john.al-smith) 的内容。
  • 这是不匹配模式的列表(使用 RegexDesigner):“john.al-caboon”、“john.smith.1”、“john.al-smith.1”
【解决方案2】:

也许你应该避开点

\.

【讨论】:

    【解决方案3】:

    使用这个表达式:\w+\S*?\.\w+\S*

    我将您的定义读为:

    • 至少一个字符
    • 必填点
    • 至少一个字符

    这使用 .NET RegexOptions.ECMAScriptRegexOptions.Multiline 成功运行

    【讨论】:

      【解决方案4】:

      [a-zA-Z]\w*(.[-\w]+){1,2}$ 效果很好...查看http://regexr.com?3020g

      【讨论】:

        【解决方案5】:

        \w 表示[A-Za-z0-9_]。这就是它匹配“1234”的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-29
          • 2019-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          相关资源
          最近更新 更多