正则表达式在用{{}}封装的字符串前后找到匹配的一个单词

时间:2019-09-18 13:11:08

标签: regex backtracking

示例字符串:

Hi,
{{name}} from {{place}}  has closed your leave application (#2473)

此处正则表达式应与全局大括号前后的单词匹配。

例如。

  

对于 {{name}} ,它应该与 hi from 相匹配。

     

对于 {{place}} ,它应该与 from has 相匹配。

我写的正则表达式:

/([^\ ]+?)? +?({{.+?}})[ \n]+([^\ {]+)?/iug

如果两个curley支撑项之间的单词不止一个,则此匹配正确。如果只有1个字,则会引起问题。

当前

  

对于 {{name}} ,它与 hi from 相匹配。 -这是正确的

     

对于 {{place}} ,它与相匹配。 -这是错误的,它也应该与 from 相匹配

REGEX101链接

  

https://regex101.com/r/wtyOIB/1

示例原始文本

Hi,

Vinod Sai from hyderabad has closed your leave application (#2473)

1 个答案:

答案 0 :(得分:1)

您可以像这样将最后一部分括在正面的前瞻中:

(?:(\S+)\s+)?({{.*?}})(?=(?:\s+(\S+))?)

请参见regex demo

详细信息

  • (?:(\S+)\s+)?-一个可选的非捕获组,它将匹配1个或0个出现的1+个非空白字符(捕获到第1组),然后匹配1+个空白字符
  • ({{.*?}})-第2组:{{,除换行符以外的任何0+字符,应尽可能少
  • (?=(?:\s+(\S+))?)-正向超前,在将非空白字符捕获到第3组中时,将需要在当前位置的右侧紧接一个可选的1+个空白字符和1+个非空白字符的顺序,但是强制正则表达式索引必须保持在尝试匹配超前模式之前的位置,因为超前是零宽度断言。