How to delete text after the 2nd specific character in each row



  • how to delete text after the 2nd “|” in each row ( i just showed 3 rows for example )

    string1 | string2 | string3 | string5744
    string4001 | string2668 | string1234 | string496
    string201 | string202 | string203 | string489

    I would like to change it into this one :

    string1 | string2 |
    string4001 | string2668 |
    string201 | string202 |



  • @Crimson-Virtuoso said in How to delete text after the 2nd specific character in each row:

    how to delete text after the 2nd “|” in each row ( i just showed 3 rows for example )
    string1 | string2 | string3 | string5744
    string4001 | string2668 | string1234 | string496
    string201 | string202 | string203 | string489
    I would like to change it into this one :
    string1 | string2 |
    string4001 | string2668 |
    string201 | string202 |

    One solution might be to find: ^(.*?\|){2}\K.*
    and keep replace empty. Check regular expression.



  • This post is deleted!


  • @Crimson-Virtuoso

    one thing I keep forgetting, when using the \K notation then
    you need to do replace all in order to make it work.
    You can use find to jump through the matches but you cannot use
    replace while doing this. To be honest, I don’t know why this happens. Bug/Feature !?



  • @Ekopalypse

    you need to do replace all in order to make it work.
    To be honest, I don’t know why this happens. Bug/Feature !?

    What if it isn’t really a bug and isn’t really a feature?
    But just something that happens as a side effect of usual processing?
    I guess it has to be labelled a “bug”.

    See HERE for the line of code that I think prevents single replace (with \K involved) from working.

    When the Replace button is pressed, it really performs a “find next” first. The match is shown to the user in the form of a selection. A second press of Replace will then do the replacement, but first it verifies by doing another “find next” that the selected text is still a match. The user could certainly have changed the selection to something else in the meantime, and N++ doesn’t just want to “blindly” replace the selected text.

    In the case of a \K usage, what is shown to the user (via selected text) as a match is only what matches after the (final) \K in the search expression. Thus when N++ does its “verify check” that the selected text is indeed OK to be replaced, that check fails because it doesn’t match the entire search expression, but rather only the trailing part. The line of code I flagged above will actually be comparing with the next real match of the entire expression, which fails and thus the replacement is not conducted.

    Replace All with \K works fine because it doesn’t have the “burden” of needing a mechanism to show what matched to the user.



  • @Alan-Kilborn

    thx for clarification, sounds reasonable.



  • Hi, @crimson-virtuoso, @alan-kilborn, @ekopalypse and All,

    Alan, very informative post, indeed ! So, If I correctly understand what you said, this means that :

    • If the test, on present line 1816 of the FindReplaceDlg.cpp file, for a possible change of selection range, would have been absent, the \K regex feature would work, while doing a single replace operation, with the Replace button ?

    I backup your post’s link for future reference, if any question regarding the weird behavior of the \K feature ;-))

    Best Regards,

    guy0038



  • @guy038

    Well, it wouldn’t be as simple as removing the indicated line, as that would break other functionality.
    Truly, though, I haven’t thought too much about it.
    While I can kinda read C++, and I can use the Visual Studio debugger to step through its code, it isn’t my strong suit.
    Hmm, maybe I don’t have a “strong suit”. (Is that a known expression?)
    I leave it to others, but I’m fairly confident in my analysis presented earlier about this; I spent a bit of time single-stepping through it and looking at it.


Log in to reply