我是regex的新手,正在尝试捕获某种模式。我想捕获两个单词(名称1和主机),问题是,有时介于两者之间的“所有内容”可能包含“名称1”。如果它确实包含“ name1”,则它包括从前一个name1到下一个“主机”字的所有内容。因此,我基本上从两个不同的“ name1”中捕获了两个“字符串”。
这是我的示例:
name1{want-this-string}host,name1{want-this-string}host,name1{dont-want-this-string},name1{dont-want-this-either}name1{want-this-string}host
这是我现在正在使用的正则表达式。
(?<=\bname1\b).*?(?=\bhost\b)
我的预期输出是它与3个{want-this-string}
匹配,而不与{dont-want-this}
匹配。基本上就是这样:
{want-this-string}{want-this-string}{want-this-string}
但是现在它抓住了前两个{want this string}
,然后是整个部分
{dont-want-this-string},name1{dont-want-this-either}name1{want-this-string}
答案 0 :(得分:1)
我不太确定,这种模式是否可以传递我们想要的和潜在的输入,但是我们同样会根据可能带有左约束或必要右约束的情况,开始设计一个表达式,例如:
(^name1|}name1)({.+?})?|(host,name1)({.+?})(host,name1)
这部分可以大大简化:
(host,name1)({.+?})(host,name1)
,我们在此处添加它只是为了举例说明右边界的实现,该边界仅捕获(host,name1)
值的第一个实例。
jex.im可视化正则表达式:
如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。
答案 1 :(得分:1)
如果您有GNU grep,则可以使用
grep -oP '\bname1\{\K[^{}]*(?=}host\b)' file
使用pcregrep
(如果正在使用该操作系统,则可以将其安装在MacOS上),
pcregrep -oM '\bname1\{\K[^{}]*(?=}host\b)' file
请参见regex demo
详细信息
\bname1\{
-整个单词name1
和后面的{
\K
-匹配重置运算符丢弃整个匹配项[^{}]*
-除{
和}
以外的0个或更多字符(?=}host\b)
-当前位置的右边必须有一个}host
作为一个整体词。请参见online grep demo:
s="name1{want-this-string}host,name1{want-this-string}host,name1{dont-want-this-string},name1{dont-want-this-either}name1{want-this-string}host"
grep -oP '\bname1\{\K[^{}]*(?=}host\b)' <<< "$s"
输出:
want-this-string
want-this-string
want-this-string