java - 如何将数量条件添加到正则表达式而不将数量包含到匹配组中?

标签 java regex

我只想在附加数量条件成立时创建匹配项。

示例(很好):

正则表达式:-(START.*?)_\d+(?=-END)

输入:test-START_one_two_third_4-END

匹配组 1:START_one_two_third

无论如何,我想添加一个额外的检查,在组匹配中,应该有 _{3,4} 字符。但并没有直接互相关注。

所以我必须使用 (?:...) 创建一个额外的非捕获组。 我尝试过的方法:查找 _* 4 次,直到 -END:

(?:(?:_[^_]*){4}-END)

但是将其添加到正则表达式中将不再创建匹配项。为什么?

https://regex101.com/r/MHzWBr/2

最佳答案

您可以在此处使用前瞻:

-(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)

参见this regex demo

(?:(?!-(?:END|START)).)* 模式是 tempered greedy token .

关于java - 如何将数量条件添加到正则表达式而不将数量包含到匹配组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54519624/

相关文章:

c# - 找不到正确的正则表达式模式来获取 html 标签之间的值

regex - 使用 prxmatch 匹配以某个字符结尾的字符串

java - 从终端生成 WAR 并将其部署到 tomcat 时我做错了什么?

java - 如何在没有 STOMP 的情况下使用支持 Spring Websocket 的 Spring Security?

java - 如何实现空格键的actionListener作为 Action 事件

php搜索接受不完整的输入

php - 匹配两个标签之间所有内容的正则表达式

java - 检查是否 double = 1/3

java - 迭代泛型类方法返回的某些列表

php - 如何实际地将 CSV 文件中的值拆分到 MySQL 数据库中