8

Let's say I have a string like "abcabcabc" and I want the positions of 'a's and 'b's swapped so that I end up with "bacbacbac". What is the most elegant solution for this? (For the sake of this question I hereby define 'elegant' as fast and readable.)

I came up with

"abcabcabc".replace( /[ab]/g, function( c ){ return { 'a': 'b', 'b': 'a' }[ c ] } )

Which I neither regard fast nor readable. But now I wonder if there is a better way of doing it?

EDIT: The characters can be at any position. So the answer should hold for "xyza123buvwa456" (would be then "xyzb123auvwb456", too.

EDIT2: "swap" seems to be the wrong word. Replace all of a with b and all of b with a while both are single characters.


I throw in a couple of other ones:

"abcabcabc".replace( 'a', '_' ).replace( 'b','a' ).replace( '_', 'b' )

"abcabcabc".replace( /[ab]/g, function( c ){ return "ba".charAt( c.charCodeAt()-'a'.charCodeAt() ); } )

"abcabcabc".replace( /[ab]/g, function( c ){ return "ab".charAt( "ba".indexOf( c ) ) } )

I ended up using a modified version of Mark C.'s Answer:

"abcabcabc".replace( /[ab]/g, c => c == 'a' ? 'b' : 'a' )
6
  • So, how are you measuring performance that that code isn't fast? We need an object way to measure the answers or this is going to be opinion-based... Commented Feb 1, 2018 at 20:46
  • 2
    So this looks more like you are just replacing a with b and b with a rather than swapping. Is that actually intentional, because it's not quite the same thing. For example aaab -> bbba if you just replace, whereas if you swap you might expect baaa (or aaba your rules on swapping aren't clear here) Commented Feb 1, 2018 at 20:47
  • How do I swap substrings within a string? Commented Feb 1, 2018 at 20:49
  • Possible duplicate of How do I swap substrings within a string? Commented Feb 1, 2018 at 20:56
  • @Matt: You are right. See Edit2. Commented Feb 1, 2018 at 21:00

5 Answers 5

14

Try this :

str.replace(/[ab]/g, function($1) { return $1 === 'a' ? 'b' : 'a' })

example:

console.log("abcabcabc".replace(/[ab]/g, function($1) { return $1 === 'a' ? 'b' : 'a' }))

Sign up to request clarification or add additional context in comments.

3 Comments

You don't need the pipe |. In fact, it shouldn't be there at all
@MattBurland Got it - I was trying a myriad of different combinations and TBH have been trying to learn RegEx throug SO. Thanks for your help
Thanks. I ended up with a slightly modified version but I think this is both the cleanest and fastest way of doing it. (At least if not someone finds a sane way of doing it without regex.)
4

You can swap them (if they're always adjacent) by using a split/join combo:

console.log("abcabcabc".split("ab").join("ba"))

And in keeping with the split/join method, here's a way to swap them as individual characters (although it becomes significantly less readable):

console.log("aabbccaabbcc".split("a").map(s => s.split("b").join("a")).join("b"));

2 Comments

Thanks for your answer. I really like it's creative approach. But please see Edit.
@Scheintod I edited the answer with a way to swap non-adjacent characters, although I don't know if I'd recommend ever doing it that way (a regex replace is almost certainly more readable).
1

replace function accepts a string as the second parameter.

"abcabcabc".replace( /ab/g, "ba")

2 Comments

That will replace both a and b with ba
@MattBurland Not true. This works as expected if ab are always adjacent.
1

I use this method when I need to swap long list of characters\words\strings!

The method also prevents strings already replaced to be replaced again, Example:

String = "AAABBBCCC BBB"

Replace "AAABBBCCC" with "BBB", then, "BBB" with "DDD"

Final String = "BBB DDD"

Note that, only "BBB" from the original string is replaced to "DDD"! The "BBB" replaced from "AAABBBCCC" is not re-replaced to "DDD"!

Comments

0

Use a direct replace using Regex:

var result = "abcabcabc".replace( /ab/g, "ba");
console.log(result);

3 Comments

@MarkC. are you serius? I was writing the answer using the JS snippet tool [<>]
@MarkC. you're wrong, he posted a wrong answer and then modified it
@MarkC. look the versions of his answer, come on!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.