正则表达式用于捕获重复模式

瑞安·金(Ryan King)

我从具有重复模式的正则表达式捕获中获得以下正则表达式

([0-9]{1,2}h)[ ]*([0-9]{1,2}min):[ ]*(.*(?:\n(?![0-9]{1,2}h).*)*)

它需要以下字符串

1h 30min: Title 
- Description Line 1
1h 30min: Title
- Description Line 1
- Description Line 2
- Description Line 3

并产生这个结果

Match 1:
  "1h 30min: Title 
  - Description Line 1"

      Group 1: "1h"
      Group 2: "30min"
      Group 3: "Title 
               - Description Line 1"

Match 2:
  "1h 30min: Title 
 - Description Line 1
 - Description Line 2
 - Description Line 3"

      Group 1: "1h"
      Group 2: "30min"
      Group 3: "Title 
               - Description Line 1
               - Description Line 2
               - Description Line 3"

现在,我的匹配1h 30min并不总是出现在新行上。所以说我有以下字符串

1h 30min: Title 
- Description Line 1 1h 30min: Title - Description Line 1
- Description Line 2
- Description Line 3

如何修改正则表达式以获得以下匹配结果?

Match 1:
  "1h 30min: Title 
  - Description Line 1"

      Group 1: "1h"
      Group 2: "30min"
      Group 3: "Title 
               - Description Line 1"

Match 2:
  "1h 30min: Title - Description Line 1
 - Description Line 2
 - Description Line 3"

      Group 1: "1h"
      Group 2: "30min"
      Group 3: "Title - Description Line 1
               - Description Line 2
               - Description Line 3"

我虽然删除\n会解决问题,但最终只会在第一个之后匹配所有内容1h 30min

斯科特·韦弗

您只需做一些小改动就可以完成这项工作,但问题是最后一部分。贪婪令牌的一般形式是:

(.(?!notAllowed))+

因此,针对您的情况使用此模式,并添加命名组以使内容更清楚:

(?<hours>[0-9]{1,2}h)[ ]*(?<minutes>[0-9]{1,2}min):\s*(?<description>(?:.(?!\dh\s\d{1,2}min))+)

PS:如果您无法打开“点匹配换行符”模式,则可以使用它 [\s\S]进行模拟。

regex101演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章