正则表达式,用于用新行捕获模式

时间:2019-05-27 19:41:32

标签: regex string regex-lookarounds regex-group regex-greedy

我有以下字符串

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"

我有以下正则表达式https://regex101.com/r/dp5zKq/1

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

但是,我无法弄清楚如何使任何字符/换行正则表达式在小时和分钟都达到新的匹配时停止。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以对正则表达式进行一些修改,以使其在时间字符串或使用此正则表达式输入结束之前先停止正向停止,也可以使用[\w\W]捕获多行,

([0-9]{1,2}h)\s*([0-9]{1,2}min)*:\s*([\w\W]*?)(?=[0-9]{1,2}h\s*([0-9]{1,2}min)|$)

Regex Demo 1

OR

如果时间可以出现在描述中的任何地方,即使是更好的正则表达式,您也可以使用此正则表达式,该正则表达式使用多行模式,并且在向前使用^以确保如果任何地方的描述中都没有时间,则正则表达式不会停止并使用\Z标记字符串的绝对结尾。

([0-9]{1,2}h)\s*([0-9]{1,2}min)*:\s*([\w\W]*?)(?=^[0-9]{1,2}h\s*[0-9]{1,2}min|\Z)

Regex Demo 2

让我知道这是否对您有用。

答案 1 :(得分:2)

您可以匹配组1和2中的h和min部分。

如果不是以小时模式开头(或者也包括分钟),则使用与整行匹配的重复模式。

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

说明

  • ([0-9]{1,2}h)[ ]*捕获组1,h格式
  • ([0-9]{1,2}min)捕获第2组,最小格式
  • :[ ]* Match:和1个以上的空格(空格不必在字符类中,这只是为了清楚起见)
  • (捕获组3
    • .*匹配除换行符0次以上以外的所有字符
    • (?:非捕获组
    • \n(?![0-9]{1,2}h).*匹配换行符,断言右边的不是h模式。如果不是,请匹配0次以上换行符以外的所有字符
    • )关闭非捕获组并重复0次以上
  • )关闭第3组

Regex demo

答案 2 :(得分:1)

我猜想这可能是一个需要的表达式或接近它的表达式:

([\s\S]*?)(([0-9]{1,2}h)\s*([0-9]{1,2}min)*\:)?

DEMO