【问题标题】:REGEX - nesting quantifiers in combined statementsREGEX - 组合语句中的嵌套量词
【发布时间】:2012-12-08 02:13:38
【问题描述】:

希伯来语中的姓氏可以是英文格式,它只是字母的常规组合,如“Smith”、“Camp”、“Jack”等,也可以是两个单词的组合,中间有空格中间,如“Ben David”、“Bar Yohay”、“Yom Tov”。我试图创建一个正则表达式,它允许第一种格式 - 至少两个字母长的姓氏,或第二种格式 - 由两个单词组成的姓氏,每个单词长两个或多个字母,中间有一个空格中间。这是我想出的:

(^[a-z]{2,}$)|((^[a-z]{2,}$)(^[ ]$)(^[a-z]{2,}$))

(我知道它不允许大写字母) 出于某种原因,它确实允许使用第一种格式的名称,例如 Smith 和 Jerry,但不允许使用第二种格式的名称。是不是中间空格的格式有问题?对于正则表达式专业人士来说,这应该是一件容易的事。在此先感谢:)

【问题讨论】:

  • 你知道^和$是做什么的吗?
  • 那是因为您对^$(字符串绑定的开始和结束)过于热衷。您的第二个模式(全部)应包含在 ^...$ 中,而不是围绕每个标记。

标签: regex


【解决方案1】:

您可以将正则表达式简化为

^[a-z]{2,}(?: [a-z]{2,})?$

【讨论】:

    【解决方案2】:

    您在滥用锚点(^$)。它们分别匹配字符串的开头和结尾。你真正想要的是:

    (^[a-z]{2,}$)|(^([a-z]{2,})([ ])([a-z]{2,})$)
    

    此外,您可以将表达式简化为:

    ^[a-z]{2,}$|^[a-z]{2,} [a-z]{2,}$
    

    除非您特别需要捕获组。

    或者(所以你只需要一对锚):

    ^(?:[a-z]{2,}|[a-z]{2,} [a-z]{2,})$
    

    (?:...) 是一个非捕获组,需要限制交替的范围。

    【讨论】:

    • 你能分解模式并评论它,以便 OP 有一个解决方案并且可以从中学习吗?
    • @BradChristie - OP 似乎了解字符类、交替和量词的使用。他似乎误会了主播,仅此而已。我觉得只要证明锚点只在开头和结尾就足够了。
    • 您的锚点范围有误。您需要一个围绕交替的非捕获组。事实上,你根本不需要轮换。
    • @TimPietzcker - 你是绝对正确的。我编辑了解决方案,而不是我会做的方式,而是更接近 OP 开始的方式,以向他展示差异。谢谢。
    • 谢谢!这有帮助:) 我不明白如何正确使用 ^ 和 $。
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多