用于捕获具有新行的模式的正则表达式
RegEx for capturing a pattern with new lines
我有以下字符串
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*)*)
但是我不知道如何让任何字符/换行正则表达式在遇到新的小时和分钟匹配项时停止。有什么想法吗?
我猜这可能是一个需要或接近的表达式:
([\s\S]*?)(([0-9]{1,2}h)\s*([0-9]{1,2}min)*\:)?
DEMO
您可以稍微修改您的正则表达式以使用正前瞻在时间字符串之前停止或使用此正则表达式输入结束,还可以使用 [\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)|$)
或
如果时间可以出现在描述中的任何地方,即使是更好的正则表达式,您也可以使用此正则表达式,它使用多行模式,并且在前瞻中使用 ^
以确保如果时间出现在任何地方的描述并使用 \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)
让我知道这是否适合你。
您可以匹配第 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,最小格式
:[ ]*
匹配 : 和 1+ spaces(space 不必在字符 class 中,这只是为了清楚)
(
捕获组 3
.*
匹配除换行符以外的任何字符 0+ 次
(?:
非捕获组
\n(?![0-9]{1,2}h).*
匹配一个换行符,断言右边不是h模式。如果不是,则匹配除换行符之外的任何字符 0+ 次
)
关闭非捕获组并重复0+次
)
关闭组 3
我有以下字符串
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*)*)
但是我不知道如何让任何字符/换行正则表达式在遇到新的小时和分钟匹配项时停止。有什么想法吗?
我猜这可能是一个需要或接近的表达式:
([\s\S]*?)(([0-9]{1,2}h)\s*([0-9]{1,2}min)*\:)?
DEMO
您可以稍微修改您的正则表达式以使用正前瞻在时间字符串之前停止或使用此正则表达式输入结束,还可以使用 [\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)|$)
或
如果时间可以出现在描述中的任何地方,即使是更好的正则表达式,您也可以使用此正则表达式,它使用多行模式,并且在前瞻中使用 ^
以确保如果时间出现在任何地方的描述并使用 \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)
让我知道这是否适合你。
您可以匹配第 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,最小格式:[ ]*
匹配 : 和 1+ spaces(space 不必在字符 class 中,这只是为了清楚)(
捕获组 3.*
匹配除换行符以外的任何字符 0+ 次(?:
非捕获组\n(?![0-9]{1,2}h).*
匹配一个换行符,断言右边不是h模式。如果不是,则匹配除换行符之外的任何字符 0+ 次)
关闭非捕获组并重复0+次
)
关闭组 3