【问题标题】:I allow only one hyphen (-) in regex我在正则表达式中只允许一个连字符 (-)
【发布时间】:2013-04-05 06:07:33
【问题描述】:

我有一个文本框,我可以在其中获取用户的姓氏。如何在正则表达式中只允许一个连字符 (-)?

^([a-z A-Z]*-){1}[a-z A-Z]*$

【问题讨论】:

  • 您的正则表达式只允许一个连字符,那么您的问题是什么?

标签: regex


【解决方案1】:

您的正则表达式只允许一个-。但我假设您想要匹配“Smith”、“Smith-Kennedy”,而不是“Smith-”,为此您只需将连字符移到第二组:

^[a-z A-Z]+(-[a-z A-Z]+)?$

顺便说一句,在几乎所有使用* 的情况下+ 是更好的解决方案。

【讨论】:

  • 你的正则表达式允许一个空格。我如何捕捉空间?
  • 不,不是,上面的正则表达式不允许对单个空格进行处理。
  • 上面的正则表达式允许空间。您需要将其删除以防止空间被允许。像这样^[a-zA-Z]+(-[a-zA-Z]+)?$。在这里测试:regex101.com/r/MYdavn/1
【解决方案2】:

您可以使用否定前瞻来拒绝包含多个连字符的字符串:

^(?![^-]+-[^-]+-)[a-zA-Z- ]+$

Matched debuggex 上的演示。

Another Matched debuggex 上的演示。

Not Matched Demo debuggex 上的演示。

【讨论】:

    【解决方案3】:

    我假设您最多需要 1 个连字符。如果是这样,你想要的正则表达式是

    ^[a-z A-Z]*-?[a-z A-Z]*$
    

    您可以在www.debuggex.com 上对其进行可视化。

    【讨论】:

      【解决方案4】:

      如果匹配.*-.*-,那么你有多个连字符,这样的字符串不应该被接受

      【讨论】:

        【解决方案5】:

        您的正则表达式的一个问题是它迫使用户输入-。您可以使用? 使其成为可选:

        ^[a-z A-Z]*\-?[a-zA-Z]*$
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-11
          • 1970-01-01
          相关资源
          最近更新 更多