Search and Replace with Regex
-
Hi, I’m trying to clean up some very old code and try to use some RegEx in Notepad++.
I have a mix of variables:
A: $somearr_name[some_key]
B: $somearr_name[‘some_key’]
C: $somearr_name[$some_key]
D: ‘$somearr_name[some_key]’the goal is to have only:
$somearr_name[‘some_key’] after substitution.somearr_name and some_key should stay untouched
$somearr_name[$some_key] © and ‘$somearr_name[some_key]’ (D) should not be touched at all.
-
My Expression to find the matches is:
[^‘]$(.*?)[^$][^’]
… but I have no idea, how to handle the replacement …
-
not really sure I get what you try to achieve but what about
find what:(?<!')(\$[\w]+\[)([\w]+)(?=\])
replace with:\1'\2' -
Maybe try:
Bring up the Replace window (ctrl+h).
Find what box:(\$\w+)\[(\w+)\](?!')
Replace with box:\1['\2']
Search mode: Regular expression
Wrap around: ticked
Press the Replace All button. -
ohhhh … it looks pretty! I’ll try little more und will give some response.
Did not know about \1 … because of my poor english and knowledge about the terminology in this case: How is this kind of replacement called. -
@jens-ubert said:
How is this kind of replacement called
Hmmm, not sure exactly…maybe replacement by captured group number ? Go look it up and see if it has a better name.
-
@jens-ubert said:
How is this kind of replacement called.
The Boost documentation calls it a “backreference”. In the replacement string, the
$-based equivalent is called a “placeholder sequence”. -
Hello, @jens-ubert, @ekopalypse, @alan-kilborn, @peterjones, and All,
Jens, welcome to the N++ community !
Seemingly, I understand that your goal is to obtain the
B)syntax, leaving theC)andDsyntaxes untouched. In other words, you just would like that anyA)syntax be replaced with theBsyntax, wouldn’t you ?Thus, we have to grab any
Asyntax, specifically, and change it into theBoneComparing all syntaxes, it comes that only the
Asyntax does not contain any single quote character,'nor the$symbol, between square brackets. We can add the rule that the variable name, before the square brackets does not contain any single quote, too !On the other hand, the part before square brackets does not change, when moving from the
Ato theBsyntax. So, we just need to store the text, between square brackets, and surround it with single quotes, during replacement !
So, a possible regex would be :
SEARCH
\s\$[^'\r\n]+\[\K([^'$\r\n]+)(?=\])REPLACE
'\1'Notes :
-
The beginning of the regex
\ssearches for the general kind of space character ( the Space or Tabulation chars, the\nor\rline break chars and some others… ) -
Then the part
\$looks for the literal regex symbol$ -
Now, the syntax
[^'\r\n]+\[searches the greatest non-null range of consecutive characters, different from a single quote and line-breaks chars, followed by a literal opening square bracket -
The special syntax
\Kcancels any match and resets the regex engine working position -
Thus, the part
([^'$\r\n]+)tries, now, to match the greatest non-null range of consecutive characters, either different from a single quote, a dollar and line-breaks chars, stored as group1, due to the outer parentheses -
But ONLY IF the look-ahead
(?=\])is true, i.e. if this range is followed with an ending literal square bracket ! -
Finally, in replacement, the
\1syntax represents all group1contents, surrounded with single quotes
Best Regards,
guy038
-