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)
andD
syntaxes untouched. In other words, you just would like that anyA)
syntax be replaced with theB
syntax, wouldn’t you ?Thus, we have to grab any
A
syntax, specifically, and change it into theB
oneComparing all syntaxes, it comes that only the
A
syntax 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
A
to theB
syntax. 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
\s
searches for the general kind of space character ( the Space or Tabulation chars, the\n
or\r
line 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
\K
cancels 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
\1
syntax represents all group1
contents, surrounded with single quotes
Best Regards,
guy038
-