如何匹配两个单词之间的字符串,但仅匹配两个单词的“壁橱”?

时间:2019-06-07 16:27:34

标签: regex bash shell

我是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}

2 个答案:

答案 0 :(得分:1)

我不太确定,这种模式是否可以传递我们想要的和潜在的输入,但是我们同样会根据可能带有左约束或必要右约束的情况,开始设计一个表达式,例如:

(^name1|}name1)({.+?})?|(host,name1)({.+?})(host,name1)

这部分可以大大简化:

(host,name1)({.+?})(host,name1)

,我们在此处添加它只是为了举例说明右边界的实现,该边界仅捕获(host,name1)值的第一个实例。

Demo

RegEx电路

jex.im可视化正则表达式:

enter image description here

RegEx

如果不需要此表达式,并且希望对其进行修改,请访问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