Regexp replace to match a string, but not match a superstring
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
add a comment |
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
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
add a comment |
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
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
regular-expressions replace query-replace
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
add a comment |
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
add a comment |
3 Answers
3
active
oldest
votes
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.
@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
add a comment |
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).
add a comment |
One simple, very old-school way is to do multiple replacement passes:
Replace
VectorBase
by, sayAAAA
(some string with chars you're sure don't already occur somewhere).Replace
Vector
byVectorBase
.Replace
AAAA
byVectorBase
.
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.)
1
Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text containsAAVectorBase
, the sequence of events described above will result in the text containingVectorBaseAA
.
– 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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
@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
add a comment |
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.
@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
add a comment |
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.
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.
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
add a comment |
@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
add a comment |
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).
add a comment |
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).
add a comment |
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).
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).
edited Jan 17 at 20:15
answered Jan 17 at 19:14
philsphils
26.4k23567
26.4k23567
add a comment |
add a comment |
One simple, very old-school way is to do multiple replacement passes:
Replace
VectorBase
by, sayAAAA
(some string with chars you're sure don't already occur somewhere).Replace
Vector
byVectorBase
.Replace
AAAA
byVectorBase
.
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.)
1
Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text containsAAVectorBase
, the sequence of events described above will result in the text containingVectorBaseAA
.
– 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
add a comment |
One simple, very old-school way is to do multiple replacement passes:
Replace
VectorBase
by, sayAAAA
(some string with chars you're sure don't already occur somewhere).Replace
Vector
byVectorBase
.Replace
AAAA
byVectorBase
.
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.)
1
Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text containsAAVectorBase
, the sequence of events described above will result in the text containingVectorBaseAA
.
– 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
add a comment |
One simple, very old-school way is to do multiple replacement passes:
Replace
VectorBase
by, sayAAAA
(some string with chars you're sure don't already occur somewhere).Replace
Vector
byVectorBase
.Replace
AAAA
byVectorBase
.
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.)
One simple, very old-school way is to do multiple replacement passes:
Replace
VectorBase
by, sayAAAA
(some string with chars you're sure don't already occur somewhere).Replace
Vector
byVectorBase
.Replace
AAAA
byVectorBase
.
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.)
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 containsAAVectorBase
, the sequence of events described above will result in the text containingVectorBaseAA
.
– 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
add a comment |
1
Even if 'AAAA' doesn't appear in the text, that approach may fail. If the text containsAAVectorBase
, the sequence of events described above will result in the text containingVectorBaseAA
.
– 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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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