问题
So, I did a global undoable RegEx search and replace. I forgot to include the '
in the replace. Now I need to do a search on strings that match the below. It must not start with a '
and will have | translate
at the end. These are Angular translation keys - they can be all over in the template file (HTML). They always begin with {{, have | translate, and end with }}. Now the kicker is they could have spacing or line break issues (less likely but a chance). So it could be {{_ _ textToKeepAdd'To _ _ | _ _ translate _ _ }} The _ _ being spaces or a line break possibility.
Strings To Match (no beginning '):
anyText' | translate
<other text or tags>{{ anyText' | translate
{{ // line break
anyText' | translate
anyText'
| translate // line break
Strings Not To Match:
'anyText' | translate
<other text or tags>{{ 'anyText' | translate
'anyText'
| translate
Return String Format:
'anyText' | translate
Example:
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
Here is the code that I biffed on - '(?:\w+\.){1,3}(?=\w+'\s+\|\s+translate\b)
I am going to need a group capturing/returning in the replace.
回答1:
This should do the trick:
Replace \{\{(?:\s|\n)*(?!(?:'|\s|\n))(.*')(?:\s|\n)*(\|(?:\s|\n)+translate)\b
with {{ '$1 $2
Regex 101 Demo
Explanation:
\{\{
- match two open braces(?:\s|\n)*
- match any number of whitespace characters(?!(?:'|\s|\n))(.*')
- capture group 1; match any continuous string of not'
characters followed by a single'
(?:\s|\n)*
- match any number of whitespace characters(\|(?:\s|\n)+translate)
- capture group 2; match|
followed by at least one, or more, whitespace character and then the wordtranslate
.\b
- match a word boundary
回答2:
I suggest using
Find What: \{\{[\s\n]*(?!['\s\n])(.*')[\s\n]*(\|[\s\n]+translate)\b
Replace With: {{ '$1 $2
See online regex demo (altered to reflect how it works in VSCode).
Details
^
- start of a line\{\{
- a{{
substring[\s\n]*
- 0+ whitespaces/linebreaks(?!['\s\n])
- a negative lookahead failing the match if immediately to the right of the current location there is a'
or a whitespace (linebreak included)(.*')
- Capturing group 1: any 0+ chars other than line break chars, as many as possible and then a'
char[\s\n]*
- 0+ whitespaces/linebreaks(\|[\s\n]+translate)\b
- Group 2: a|
, 1+ whitespaces/linebreaks and a whole wordtranslate
.
The replacement is '
, Group 1 backreference (referring to the value captured in Group 1), space and Group 2 backreference (referring to the value captured in Group 2).
来源:https://stackoverflow.com/questions/56707400/regex-return-found-group-if-string-does-not-start-with-vscode-search-repla