我有一个逗号分隔的数字,我想匹配START
之后或之前的每个项目,如果存在任何关键字,END
。
我使用
(?:.*?START|END.*)(*SKIP)(*F)|d+
除了那些START
出现在END
或多个START
实例之后并END
存在的。
输入 | 匹配 |
---|---|
123,45678,789,777,888,1234 | 123 ,45678 ,789 ,777 ,888 ,1234 |
123,START,789,777,888,1234 | 789 ,777 ,888 ,1234 |
123,45678,789,777,END,1234 | 123 ,45678 ,789 ,777 |
123,START,789,777,END,1234 | 789 ,777 |
123,END,789,777,START,1234 | 123 |
123,START,789,START,777,END,1234 | 789 ,777 |
123,START,789,END,777,END,1234 | 789 |
123,END,789,START,777,END,1234 | 123 |
您可以通过添加限制来查找前面没有END
START
来修复模式:
(?:^(?:(?!END).)*?START|END.*)(*SKIP)(*F)|d+
// ^^^^^^^^^^^^^^^
请参阅正则表达式演示。
在这里,^(?:(?!END).)*?START
(而不是.*?START
)匹配
^
- 字符串的开头(?:(?!END).)*?
- 除换行符字符外,尽可能少地不启动END
字符序列的字符START
-START
字符序列。
您也可以使用
(?:G(?!A)|^(?:(?:(?!END).)*?START)?)(?:(?!END).)*?Kd+
请参阅正则表达式演示。
详情:
(?:G(?!A)|^(?:(?:(?!END).)*?START)?)
- 前一个成功匹配的结束(G(?!A)
)或(|
)字符串(^
)的开头,然后是任何文本的可选出现,直到第一次出现START
之前没有END
((?:(?:(?!END).)*?START)?
)(?:(?!END).)*?
- 除换行符字符外的任何字符,零次或多次,但尽可能少,不启动END
字符序列K
- 匹配重置运算符,丢弃到目前为止从整体匹配内存缓冲区匹配的所有文本d+
- 一个或多个数字。