正则表达式返回找到的组IF字符串不是以'开头--VSCode-搜索/替换

时间:2019-06-21 16:37:57

标签: regex regex-group

因此,我进行了全局可撤销的RegEx搜索并替换。我忘记在替换中包含'。现在,我需要搜索与以下内容匹配的字符串。它不能以'开头,并且结尾应为| translate。这些是Angular转换键-它们可以放在模板文件(HTML)中。他们总是以{{翻译,并以}}结尾。现在最重要的是,他们可能会遇到间距或换行问题(可能性较小,但有机会)。因此可能是{{_ _ textToKeepAdd'To _ _ | _ _是空格或换行的可能性。

要匹配的字符串(不以'开始):

anyText' | translate

<other text or tags>{{ anyText' | translate

{{  // line break
anyText' | translate

anyText'
 | translate // line break

不匹配的字符串:

'anyText' | translate

 <other text or tags>{{ 'anyText' | translate

'anyText'
 | translate

返回字符串格式:

'anyText' | translate

示例:

blahadskfjlksjdf' | translate = 'blahadskfjlksjdf' | translate

'SkipMe' | translate = not found for replacement bc it starts with a '.

And <other text or tags>{{ anyText' | translate =  <other text or tags>{{ 'anyText' | translate

这是我所引用的代码-'(?:\w+\.){1,3}(?=\w+'\s+\|\s+translate\b)

我需要一个小组来捕获/返回替换组。

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

替换 \{\{(?:\s|\n)*(?!(?:'|\s|\n))(.*')(?:\s|\n)*(\|(?:\s|\n)+translate)\b

{{ '$1 $2

Regex 101 Demo

说明:

  • \{\{-匹配两个大括号

  • (?:\s|\n)*-匹配任意数量的空白字符

  • (?!(?:'|\s|\n))(.*')-捕获组1;匹配任何非'字符的连续字符串,后跟单个'

  • (?:\s|\n)*-匹配任意数量的空白字符

  • (\|(?:\s|\n)+translate)-捕获组2;匹配|,后跟至少一个或多个空格字符,然后再加上单词translate

  • \b-匹配单词边界

答案 1 :(得分:1)

我建议使用

查找内容\{\{[\s\n]*(?!['\s\n])(.*')[\s\n]*(\|[\s\n]+translate)\b
替换为{{ '$1 $2

请参见online regex demo(已更改以反映其在VSCode中的工作方式)。

enter image description here

详细信息

  • ^-一行的开头
  • \{\{-一个{{子字符串
  • [\s\n]*-超过0个空格/换行符
  • (?!['\s\n])-如果在当前位置的右侧紧邻有'或空白(包括换行符),则负匹配将使匹配失败。
  • (.*')-捕获组1:除换行符以外的任何0+字符,并尽可能多地添加'字符
  • [\s\n]*-超过0个空格/换行符
  • (\|[\s\n]+translate)\b-第2组:|,1个以上的空格/换行符和整个单词translate

替换为',组1反向引用(指的是在组1中捕获的值),空格和组2反向引用(指的是在组2中捕获的值)。