我正在尝试匹配包含特定文本的文本块。每个块都由标准的开始/结束文本模式清楚地定义。
在下面的示例中,我希望匹配"step start“到"step end”中的步骤1和3,因为它们包含文本"database:dev“。但是,我当前的正则表达式可以很好地匹配步骤1,但随后在单个匹配中匹配步骤2和3。下面的示例可能更容易理解:https://regex101.com/r/56tfOQ/3/
我需要指定每个匹配只能包含一个"step start",但我不知道如何做到这一点。
我目前使用的正则表达式是:
(?msi)step start.*?database:dev.*?step end
文本的一个例子是:
step start
name:step1
database:dev1
step end
step start
name:step2
database:test1
step end
step start
name:step3
database:dev2
step end
step start
name:step4
database:test2
step end
发布于 2019-05-23 03:42:24
在一个常见的场景中,您可以在起始分隔符和应该出现在分隔符之间的第三个字符串之间使用像(?:(?!<STOP_PATTERN>).)*?
这样的tempered greedy token。
您可以将正则表达式编写为
(?si)step start(?:(?!step start).)*?database:dev.*?step end
但是,您的开始分隔符似乎在一行的开头。那么它就有意义使用
(?msi)^step start(?:(?!^step start).)*?database:dev.*?step end
请参阅regex demo
正则表达式图:
详细信息
(?msi)
-多行、多行和不区分大小写模式是on^
-行开始(因为on)step start
选项是delimiter(?:(?!^step start).)*?
-开始linedatabase:dev
-匹配任何字符的字符,出现/重复的次数尽可能少,不会在substring.*?
的开头启动step start
字符序列-文字m
-任何tempered greedy token字符,少到0+ -结束分隔符。https://stackoverflow.com/questions/56263709
复制相似问题