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 …



  • @jens-ubert

    not really sure I get what you try to achieve but what about
    find what:(?<!')(\$[\w]+[)([\w]+)(?=])
    replace with:\1'\2'



  • @jens-ubert

    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 the C) and D syntaxes untouched. In other words, you just would like that any A) syntax be replaced with the B syntax, wouldn’t you ?

    Thus, we have to grab any A syntax, specifically, and change it into the B one

    Comparing 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 the B 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 group 1, 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 group 1 contents, surrounded with single quotes

    Best Regards,

    guy038


Log in to reply