Regexp replace to match a string, but not match a superstring












6















Let's say I want to replace the string "Vector" by "VectorBase", but there are existing instances of "VectorBase". So I would like to omit "VectorBase". What is an elegant way to achieve this?



An easy way is to do ignore the condition and do the replacement and at the end replace all instances of BaseBase by Base. I'm looking for a better way to achieve this.










share|improve this question




















  • 1





    What you are looking for is made less clear by your saying that you want an "elegant" way and "a better way", without specifying what you mean by those conditions. Perhaps just ask for a way, and then you can choose which one(s) you think best.

    – Drew
    Jan 18 at 4:25
















6















Let's say I want to replace the string "Vector" by "VectorBase", but there are existing instances of "VectorBase". So I would like to omit "VectorBase". What is an elegant way to achieve this?



An easy way is to do ignore the condition and do the replacement and at the end replace all instances of BaseBase by Base. I'm looking for a better way to achieve this.










share|improve this question




















  • 1





    What you are looking for is made less clear by your saying that you want an "elegant" way and "a better way", without specifying what you mean by those conditions. Perhaps just ask for a way, and then you can choose which one(s) you think best.

    – Drew
    Jan 18 at 4:25














6












6








6








Let's say I want to replace the string "Vector" by "VectorBase", but there are existing instances of "VectorBase". So I would like to omit "VectorBase". What is an elegant way to achieve this?



An easy way is to do ignore the condition and do the replacement and at the end replace all instances of BaseBase by Base. I'm looking for a better way to achieve this.










share|improve this question
















Let's say I want to replace the string "Vector" by "VectorBase", but there are existing instances of "VectorBase". So I would like to omit "VectorBase". What is an elegant way to achieve this?



An easy way is to do ignore the condition and do the replacement and at the end replace all instances of BaseBase by Base. I'm looking for a better way to achieve this.







regular-expressions replace query-replace






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 18 at 4:24









Drew

47.5k462104




47.5k462104










asked Jan 17 at 14:48









fermesommefermesomme

217210




217210








  • 1





    What you are looking for is made less clear by your saying that you want an "elegant" way and "a better way", without specifying what you mean by those conditions. Perhaps just ask for a way, and then you can choose which one(s) you think best.

    – Drew
    Jan 18 at 4:25














  • 1





    What you are looking for is made less clear by your saying that you want an "elegant" way and "a better way", without specifying what you mean by those conditions. Perhaps just ask for a way, and then you can choose which one(s) you think best.

    – Drew
    Jan 18 at 4:25








1




1





What you are looking for is made less clear by your saying that you want an "elegant" way and "a better way", without specifying what you mean by those conditions. Perhaps just ask for a way, and then you can choose which one(s) you think best.

– Drew
Jan 18 at 4:25





What you are looking for is made less clear by your saying that you want an "elegant" way and "a better way", without specifying what you mean by those conditions. Perhaps just ask for a way, and then you can choose which one(s) you think best.

– Drew
Jan 18 at 4:25










3 Answers
3






active

oldest

votes


















8














Try _<Vector_>. The _< construct matches the empty string, but only at the beginning of a symbol. _> is the same, but at the end of a symbol. What is a "symbol" depends on the buffer's syntax table; in programming language modes it's meant to be what the language treats as a symbol or identifier. You can also use <Vector> or bVectorb to match a whole “word”, but that typically matches the Vector in Vector_Base, whereas _<Vector_> matches in Vector+1 but not in Vector_Base.



See Backslash Constructs in Regular Expressions for more information.






share|improve this answer


























  • @Gilles: thanks! TIL something new.

    – NickD
    Jan 18 at 18:06











  • I really like this answer and Giles's edit. The other answers are good too!

    – fermesomme
    2 days ago



















6














Another simple trick you can use is to match both Vector and VectorBase, and replace them both with VectorBase.



Vector(Base)? → VectorBase


More complicated cases can be handled by using elisp in the replacement. For example, the following replaces "Vector" with "Array" unless it was "VectorBase", in which case it 'keeps' it as "VectorBase" (i.e. replaces it with the matched string).



Vector(Base)? → ,(if 1 & "Array")


Which is similar (in terms of the end result) to what can be done with arbitrary look-around assertions (in regexp languages which support those).






share|improve this answer

































    4














    One simple, very old-school way is to do multiple replacement passes:




    1. Replace VectorBase by, say AAAA (some string with chars you're sure don't already occur somewhere).


    2. Replace Vector by VectorBase.


    3. Replace AAAA by VectorBase.



    This works for replace-all and query-replace. It's pretty fail-safe and doesn't require any complex matching or fancy replacement regexp.



    However: It's important that you first check that there are not already some occurrences of any chars of the string you're thinking of using as the temporary replacement (e.g. AAAA). If there are already such occurrences then choose a different string. ;-) (I typically use a string such as ^G (a Control-G character), input in the minibuffer using C-q C-g - after making sure there is no C-g char in the buffer.)






    share|improve this answer





















    • 1





      Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text contains AAVectorBase, the sequence of events described above will result in the text containing VectorBaseAA.

      – Abigail
      Jan 17 at 21:25











    • @Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.

      – Drew
      Jan 17 at 22:33













    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "583"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2femacs.stackexchange.com%2fquestions%2f47218%2fregexp-replace-to-match-a-string-but-not-match-a-superstring%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    8














    Try _<Vector_>. The _< construct matches the empty string, but only at the beginning of a symbol. _> is the same, but at the end of a symbol. What is a "symbol" depends on the buffer's syntax table; in programming language modes it's meant to be what the language treats as a symbol or identifier. You can also use <Vector> or bVectorb to match a whole “word”, but that typically matches the Vector in Vector_Base, whereas _<Vector_> matches in Vector+1 but not in Vector_Base.



    See Backslash Constructs in Regular Expressions for more information.






    share|improve this answer


























    • @Gilles: thanks! TIL something new.

      – NickD
      Jan 18 at 18:06











    • I really like this answer and Giles's edit. The other answers are good too!

      – fermesomme
      2 days ago
















    8














    Try _<Vector_>. The _< construct matches the empty string, but only at the beginning of a symbol. _> is the same, but at the end of a symbol. What is a "symbol" depends on the buffer's syntax table; in programming language modes it's meant to be what the language treats as a symbol or identifier. You can also use <Vector> or bVectorb to match a whole “word”, but that typically matches the Vector in Vector_Base, whereas _<Vector_> matches in Vector+1 but not in Vector_Base.



    See Backslash Constructs in Regular Expressions for more information.






    share|improve this answer


























    • @Gilles: thanks! TIL something new.

      – NickD
      Jan 18 at 18:06











    • I really like this answer and Giles's edit. The other answers are good too!

      – fermesomme
      2 days ago














    8












    8








    8







    Try _<Vector_>. The _< construct matches the empty string, but only at the beginning of a symbol. _> is the same, but at the end of a symbol. What is a "symbol" depends on the buffer's syntax table; in programming language modes it's meant to be what the language treats as a symbol or identifier. You can also use <Vector> or bVectorb to match a whole “word”, but that typically matches the Vector in Vector_Base, whereas _<Vector_> matches in Vector+1 but not in Vector_Base.



    See Backslash Constructs in Regular Expressions for more information.






    share|improve this answer















    Try _<Vector_>. The _< construct matches the empty string, but only at the beginning of a symbol. _> is the same, but at the end of a symbol. What is a "symbol" depends on the buffer's syntax table; in programming language modes it's meant to be what the language treats as a symbol or identifier. You can also use <Vector> or bVectorb to match a whole “word”, but that typically matches the Vector in Vector_Base, whereas _<Vector_> matches in Vector+1 but not in Vector_Base.



    See Backslash Constructs in Regular Expressions for more information.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Jan 18 at 8:10









    Gilles

    13.3k43475




    13.3k43475










    answered Jan 17 at 15:08









    NickDNickD

    2,5011312




    2,5011312













    • @Gilles: thanks! TIL something new.

      – NickD
      Jan 18 at 18:06











    • I really like this answer and Giles's edit. The other answers are good too!

      – fermesomme
      2 days ago



















    • @Gilles: thanks! TIL something new.

      – NickD
      Jan 18 at 18:06











    • I really like this answer and Giles's edit. The other answers are good too!

      – fermesomme
      2 days ago

















    @Gilles: thanks! TIL something new.

    – NickD
    Jan 18 at 18:06





    @Gilles: thanks! TIL something new.

    – NickD
    Jan 18 at 18:06













    I really like this answer and Giles's edit. The other answers are good too!

    – fermesomme
    2 days ago





    I really like this answer and Giles's edit. The other answers are good too!

    – fermesomme
    2 days ago











    6














    Another simple trick you can use is to match both Vector and VectorBase, and replace them both with VectorBase.



    Vector(Base)? → VectorBase


    More complicated cases can be handled by using elisp in the replacement. For example, the following replaces "Vector" with "Array" unless it was "VectorBase", in which case it 'keeps' it as "VectorBase" (i.e. replaces it with the matched string).



    Vector(Base)? → ,(if 1 & "Array")


    Which is similar (in terms of the end result) to what can be done with arbitrary look-around assertions (in regexp languages which support those).






    share|improve this answer






























      6














      Another simple trick you can use is to match both Vector and VectorBase, and replace them both with VectorBase.



      Vector(Base)? → VectorBase


      More complicated cases can be handled by using elisp in the replacement. For example, the following replaces "Vector" with "Array" unless it was "VectorBase", in which case it 'keeps' it as "VectorBase" (i.e. replaces it with the matched string).



      Vector(Base)? → ,(if 1 & "Array")


      Which is similar (in terms of the end result) to what can be done with arbitrary look-around assertions (in regexp languages which support those).






      share|improve this answer




























        6












        6








        6







        Another simple trick you can use is to match both Vector and VectorBase, and replace them both with VectorBase.



        Vector(Base)? → VectorBase


        More complicated cases can be handled by using elisp in the replacement. For example, the following replaces "Vector" with "Array" unless it was "VectorBase", in which case it 'keeps' it as "VectorBase" (i.e. replaces it with the matched string).



        Vector(Base)? → ,(if 1 & "Array")


        Which is similar (in terms of the end result) to what can be done with arbitrary look-around assertions (in regexp languages which support those).






        share|improve this answer















        Another simple trick you can use is to match both Vector and VectorBase, and replace them both with VectorBase.



        Vector(Base)? → VectorBase


        More complicated cases can be handled by using elisp in the replacement. For example, the following replaces "Vector" with "Array" unless it was "VectorBase", in which case it 'keeps' it as "VectorBase" (i.e. replaces it with the matched string).



        Vector(Base)? → ,(if 1 & "Array")


        Which is similar (in terms of the end result) to what can be done with arbitrary look-around assertions (in regexp languages which support those).







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Jan 17 at 20:15

























        answered Jan 17 at 19:14









        philsphils

        26.4k23567




        26.4k23567























            4














            One simple, very old-school way is to do multiple replacement passes:




            1. Replace VectorBase by, say AAAA (some string with chars you're sure don't already occur somewhere).


            2. Replace Vector by VectorBase.


            3. Replace AAAA by VectorBase.



            This works for replace-all and query-replace. It's pretty fail-safe and doesn't require any complex matching or fancy replacement regexp.



            However: It's important that you first check that there are not already some occurrences of any chars of the string you're thinking of using as the temporary replacement (e.g. AAAA). If there are already such occurrences then choose a different string. ;-) (I typically use a string such as ^G (a Control-G character), input in the minibuffer using C-q C-g - after making sure there is no C-g char in the buffer.)






            share|improve this answer





















            • 1





              Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text contains AAVectorBase, the sequence of events described above will result in the text containing VectorBaseAA.

              – Abigail
              Jan 17 at 21:25











            • @Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.

              – Drew
              Jan 17 at 22:33


















            4














            One simple, very old-school way is to do multiple replacement passes:




            1. Replace VectorBase by, say AAAA (some string with chars you're sure don't already occur somewhere).


            2. Replace Vector by VectorBase.


            3. Replace AAAA by VectorBase.



            This works for replace-all and query-replace. It's pretty fail-safe and doesn't require any complex matching or fancy replacement regexp.



            However: It's important that you first check that there are not already some occurrences of any chars of the string you're thinking of using as the temporary replacement (e.g. AAAA). If there are already such occurrences then choose a different string. ;-) (I typically use a string such as ^G (a Control-G character), input in the minibuffer using C-q C-g - after making sure there is no C-g char in the buffer.)






            share|improve this answer





















            • 1





              Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text contains AAVectorBase, the sequence of events described above will result in the text containing VectorBaseAA.

              – Abigail
              Jan 17 at 21:25











            • @Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.

              – Drew
              Jan 17 at 22:33
















            4












            4








            4







            One simple, very old-school way is to do multiple replacement passes:




            1. Replace VectorBase by, say AAAA (some string with chars you're sure don't already occur somewhere).


            2. Replace Vector by VectorBase.


            3. Replace AAAA by VectorBase.



            This works for replace-all and query-replace. It's pretty fail-safe and doesn't require any complex matching or fancy replacement regexp.



            However: It's important that you first check that there are not already some occurrences of any chars of the string you're thinking of using as the temporary replacement (e.g. AAAA). If there are already such occurrences then choose a different string. ;-) (I typically use a string such as ^G (a Control-G character), input in the minibuffer using C-q C-g - after making sure there is no C-g char in the buffer.)






            share|improve this answer















            One simple, very old-school way is to do multiple replacement passes:




            1. Replace VectorBase by, say AAAA (some string with chars you're sure don't already occur somewhere).


            2. Replace Vector by VectorBase.


            3. Replace AAAA by VectorBase.



            This works for replace-all and query-replace. It's pretty fail-safe and doesn't require any complex matching or fancy replacement regexp.



            However: It's important that you first check that there are not already some occurrences of any chars of the string you're thinking of using as the temporary replacement (e.g. AAAA). If there are already such occurrences then choose a different string. ;-) (I typically use a string such as ^G (a Control-G character), input in the minibuffer using C-q C-g - after making sure there is no C-g char in the buffer.)







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Jan 18 at 4:26

























            answered Jan 17 at 16:29









            DrewDrew

            47.5k462104




            47.5k462104








            • 1





              Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text contains AAVectorBase, the sequence of events described above will result in the text containing VectorBaseAA.

              – Abigail
              Jan 17 at 21:25











            • @Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.

              – Drew
              Jan 17 at 22:33
















            • 1





              Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text contains AAVectorBase, the sequence of events described above will result in the text containing VectorBaseAA.

              – Abigail
              Jan 17 at 21:25











            • @Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.

              – Drew
              Jan 17 at 22:33










            1




            1





            Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text contains AAVectorBase, the sequence of events described above will result in the text containing VectorBaseAA.

            – Abigail
            Jan 17 at 21:25





            Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text contains AAVectorBase, the sequence of events described above will result in the text containing VectorBaseAA.

            – Abigail
            Jan 17 at 21:25













            @Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.

            – Drew
            Jan 17 at 22:33







            @Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.

            – Drew
            Jan 17 at 22:33




















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Emacs Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2femacs.stackexchange.com%2fquestions%2f47218%2fregexp-replace-to-match-a-string-but-not-match-a-superstring%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            An IMO inspired problem

            Management

            Has there ever been an instance of an active nuclear power plant within or near a war zone?