0

所以,我做了一个全局可撤销的 RegEx 搜索和替换。我忘了'在替换中包含 。现在我需要搜索与下面匹配的字符串。它不能以 a 开头,'并且将| translate在结尾处具有。这些是 Angular 翻译键——它们可以在模板文件 (HTML) 中。它们总是以 {{, have | 开头 翻译,并以}}结尾。现在更重要的是他们可能有间距或换行问题(不太可能但有机会)。所以它可能是 {{_ _ textToKeepAdd'To _ _ | _ _ translate _ _ }} _ _ 是空格或换行的可能性。

要匹配的字符串(无开头 '):

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)

我将需要在替换中进行组捕获/返回。

4

2 回答 2

1

这应该可以解决问题:

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

{{ '$1 $2

正则表达式 101 演示

解释:

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

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

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

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

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

  • \b- 匹配单词边界

于 2019-06-21T17:57:51.990 回答
1

我建议使用

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

请参阅在线正则表达式演示(已更改以反映它在 VSCode 中的工作方式)。

在此处输入图像描述

细节

  • ^- 一行的开始
  • \{\{- 一个{{子串
  • [\s\n]*- 0+ 空格/换行符
  • (?!['\s\n])- 如果在当前位置的右侧有'一个空格或一个空格(包括换行符) ,则匹配失败的负前瞻
  • (.*')- 捕获组 1:除换行符之外的任何 0+ 个字符,尽可能多,然后是一个'字符
  • [\s\n]*- 0+ 空格/换行符
  • (\|[\s\n]+translate)\b- 第 2 组:一个|、1+ 个空格/换行符和一个完整的单词translate

替换为'、Group 1 反向引用(指在 Group 1 中捕获的值)、space 和 Group 2 反向引用(指在 Group 2 中捕获的值)。

于 2019-06-21T18:11:34.713 回答