【问题标题】:Matching pattern if there is existing pattern in the string如果字符串中存在模式,则匹配模式
【发布时间】:2019-08-07 17:21:47
【问题描述】:

我正在尝试构建具有以下要求的正则表达式

  1. 模式应该以字母a-z开头
  2. 可以有来自字符类[\w:-]的任何字符。
  3. 可以有任意数量的下划线_,但前提是模式中的某个位置之前有:

一些有效模式的例子

你好123

你好:123

你好,你好

hello:123-hello_345 # 有效模式,因为_之前的模式中有:

hello-1:hell_world_123

无效模式

hello_123

hello-123_world

hello_123:世界

我尝试过使用前瞻,但由于某种原因它不起作用,下面是我想出的模式

^[a-z]+[a-z0-9:-]*(?<=:)[_]*\w* - 此模式的问题在于,如果字符串中的任何位置都没有 :,它将停止匹配整个模式,因此它使 : 成为必需的模式。

如果:之前的字符串中的任何位置有_,我只想检查:是否存在。

【问题讨论】:

  • 正向预读需要存在某种模式,因此如果正向预读模式不匹配,则预计会停止工作。在这些情况下,您需要负前瞻。请参阅下面的答案。

标签: python regex


【解决方案1】:

你可以使用

^(?![^_:]*_)[a-z][\w:-]*$

如果_ 前面没有_:,则(?![^_:]*_) 否定前瞻将导致匹配失败。

查看regex demoregex graph

详情

  • ^ - 字符串开头
  • (?![^_:]*_) - 如果除 _: 之外还有 0+ 个字符,紧跟在当前位置右侧的 _ 后,则匹配失败
  • [a-z] - 小写 ASCII 字母
  • [\w:-]* - 0+ 字,:- 字符
  • $ - 字符串结束。

【讨论】:

    【解决方案2】:

    可以用“或”运算符解决:

    ^[a-z]+[a-z0-9-]*(:[a-z0-9-_]*|[a-z0-9-]*)$
    

    有KISS的优势。

    【讨论】:

      【解决方案3】:

      ^[a-z]+[a-z0-9-]*((:.+)|(:[a-z0-9-_]*)|[a-z0-9-]*)$ 因此,可以通过在 OR 子句中添加模式组来解决。 这个确实适用于您提供的示例。 如果有未捕获的组,您可以添加。

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2017-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        相关资源
        最近更新 更多