【问题标题】:Start Before End开始前结束
【发布时间】:2019-03-04 00:09:07
【问题描述】:

这是一个测验练习

只匹配文本开头的行,除非文本结尾在它之前(结尾可能在字符串中,也可能不在字符串中)。匹配:ssstarttt line 并且不匹配line_end start

我试过代码

(?:.*?\s?start(?<!$).*\b|(?<!.)start|^\w+start)

结果返回

测试 23/25:它不应该匹配 end start end start end start end start。

正则表达式demo

应该匹配

ssstarttt线

重启

开始

开始结束开始

不应匹配

line_end 开始

结束开始结束开始结束开始结束开始

【问题讨论】:

    标签: regex


    【解决方案1】:

    如果文本开始应该在那里但文本结束不应该在开始之前,一种选择是使用否定的前瞻来断言右边的不是end

    ^(?:(?!end).)*start.*
    

    说明

    • ^ 字符串开头
    • (?:非捕获组
      • (?!end). 否定前瞻断言右边的内容不是结束并匹配任何字符
    • )*关闭非捕获组并重复0+次
    • start.* 匹配开始后跟任意字符 0+ 次

    regex101 demo

    【讨论】:

    • 测试 17/25:它应该匹配 aaa start end start。到目前为止,您应该想知道是否必须将其锚定到 ^。如果你确实锚定它,如何提前判断它是否在开始之前。尝试从一开始就让你的模式逐个字符匹配,如果遇到结束则让它失败。提示:/(?!end)./
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2021-04-15
    • 2012-07-23
    相关资源
    最近更新 更多