给出以下字符串或类似字符串:
baz: bar
key: >
lorem ipsum 1213 __ ^123
lorem ipsum
foo:bar
anotherkey: >
lorem ipsum 1213 __ ^123
lorem ipsum
我正在尝试构建一个REGEX,它捕获一个键后跟>
符号后的所有值。
因此,对于上面的示例,我想匹配从key
到foo
(不包括),然后从anotherkey
到结尾。我设法提出了一个REGEX来完成这项工作,但前提是我知道foo
的名字:
\w+:\s>\n\s+[\S+\s+]+(?=foo)
但这不是一个好的解决方案。如果我删除?=foo
,那么匹配将包含字符串末尾的所有内容。
如何修复此正则表达式以匹配>
之后的值?
答案 0 :(得分:2)
(根据要求;)
您可以使用类似
的内容^\w+:\s*>\n(?:[ \t].*\n?)+
(这是没有小组的。如果你决定不同他们,请看问题的评论。)
它匹配行的开头(^
),后跟至少一个单词字符(\w
AZ,az,0-9或' - '。可以更改为{{1}如果只允许使用小写字母alpha。)
然后它匹配可选空格([a-z]
),后跟\s*
键终结符和换行符(>
)。
然后匹配的非捕获组(\n
):
此组(与缩进行匹配)可以重复多次(但必须至少存在一次 - (?:
)。
答案 1 :(得分:1)
你可以调整你的正则表达式:
(\w+:\s+>\n\s+[\S\s]+?)(?=\n\w+:\w+\n|\Z)
Lookahead (?=\n\w+:\w+\n|\Z)
将在您非贪婪的匹配后声明key:value
或结束输入(\Z
)。
或者可以使用性能更好的正则表达式(感谢Wiktor下面的有用评论):
\w+:\s+>\n(.*(?:\n(?!\n\w+:\w+\n).*)+)
答案 2 :(得分:0)
如果您不确定缩进是否存在,那么这是最简单的方式,您可以获得所需的结果:
^\w+:\s+>(?:\s?[^:]*$)*
说明:
^ # Start of line
\w+:\s+> # Match specific block
(?: # Start of non-capturing group (a)
\s? # Match a newline
[^:]*$ # Match rest of line if only it doesn't have a :
)* # End of non-capturing group (a) (zero or more times - greedy)
您需要启用m
标志,如现场演示中所示。
如果始终存在前导空格,那么你可以使用这个更安全的正则表达式:
^\w+:\s+>(?:\s?[\t ]+.*)*
m
修饰符也应在这里设置。