我只想在附加数量条件成立时创建匹配项。
示例(很好):
正则表达式:-(START.*?)_\d+(?=-END)
输入:test-START_one_two_third_4-END
匹配组 1:START_one_two_third
无论如何,我想添加一个额外的检查,在组匹配中,应该有 _{3,4}
字符。但并没有直接互相关注。
所以我必须使用 (?:...)
创建一个额外的非捕获组。
我尝试过的方法:查找 _*
4 次,直到 -END
:
(?:(?:_[^_]*){4}-END)
但是将其添加到正则表达式中将不再创建匹配项。为什么?
最佳答案
您可以在此处使用前瞻:
-(START(?=(?:_[^_]*){3,4}-END).*?)_+\d+(?=-END)
^
请参阅regex demo
现在,(?=(?:_[^_]*){3,4}-END)
是一个正向前瞻,确保紧邻当前位置的右侧,有
(?:_[^_]*){3,4}
- 重复三到四次_
,后跟除之外的任何 0+ 个字符_
-END
- 文字-END
字符串。.*?
请注意,如果您想匹配 -START
和 -END
之间最接近的窗口,则需要排除 。
和 [^_]
匹配 -START
和 -END
模式的开头:
-(START(?=(?:_(?:(?!-(?:END|START))[^_])*){3,4}-END)(?:(?!-(?:END|START)).)*)_+\d+(?=-END)
(?:(?!-(?:END|START)).)*
模式是 tempered greedy token .
关于java - 如何将数量条件添加到正则表达式而不将数量包含到匹配组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54519624/