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
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
28 mins ago
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 30 mins ago
Drew
47.4k462104
47.4k462104
asked 14 hours ago
fermesommefermesomme
200110
200110
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
28 mins ago
add a comment |
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
28 mins ago
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
28 mins ago
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
28 mins ago
add a comment |
3 Answers
3
active
oldest
votes
Try bVectorb
. The b
construct matches the empty string, but only at the beginning and end of a word (what is a "word" depends on the buffer's syntax table however: it should work in most cases, but there might be corner cases that are problematic.)
See Backslash Constructs in Regular Expressions for more information.
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
7 hours ago
@Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.
– Drew
6 hours ago
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');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
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 bVectorb
. The b
construct matches the empty string, but only at the beginning and end of a word (what is a "word" depends on the buffer's syntax table however: it should work in most cases, but there might be corner cases that are problematic.)
See Backslash Constructs in Regular Expressions for more information.
add a comment |
Try bVectorb
. The b
construct matches the empty string, but only at the beginning and end of a word (what is a "word" depends on the buffer's syntax table however: it should work in most cases, but there might be corner cases that are problematic.)
See Backslash Constructs in Regular Expressions for more information.
add a comment |
Try bVectorb
. The b
construct matches the empty string, but only at the beginning and end of a word (what is a "word" depends on the buffer's syntax table however: it should work in most cases, but there might be corner cases that are problematic.)
See Backslash Constructs in Regular Expressions for more information.
Try bVectorb
. The b
construct matches the empty string, but only at the beginning and end of a word (what is a "word" depends on the buffer's syntax table however: it should work in most cases, but there might be corner cases that are problematic.)
See Backslash Constructs in Regular Expressions for more information.
edited 11 hours ago
answered 13 hours ago
NickDNickD
2,4511312
2,4511312
add a comment |
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 8 hours ago
answered 9 hours ago
philsphils
26.3k23567
26.3k23567
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
7 hours ago
@Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.
– Drew
6 hours ago
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
7 hours ago
@Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.
– Drew
6 hours ago
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 27 mins ago
answered 12 hours ago
DrewDrew
47.4k462104
47.4k462104
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
7 hours ago
@Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.
– Drew
6 hours ago
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
7 hours ago
@Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.
– Drew
6 hours ago
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
7 hours ago
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
7 hours ago
@Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.
– Drew
6 hours ago
@Abigail: Yes, of course. Use a string that has no chars used anywhere. Updated to make that clear. Thx.
– Drew
6 hours ago
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');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
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');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
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');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
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');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
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
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
28 mins ago