Replace + with Space in JavaScript

November 8, 2023

This guide walks you through how to replace the + sign with a space in a string, a common requirement when dealing with URL query strings.

What is String Replacement?

You would use the String.prototype.replace() to search a string for a specified value, or a regular expression, and return a new string with the specified values replaced.

const queryString = 'name=John+Doe&age=30'; const withSpaces = queryString.replace(/\\+/g, ' '); console.log(withSpaces); // "name=John Doe&age=30"

Global Replacement Using Regular Expressions

To replace all occurrences of +, you should use a regular expression with a global flag (g).

const text = 'Hello+World+Again'; const newText = text.replace(/\\+/g, ' '); console.log(newText); // "Hello World Again"

Edge Cases

Be careful for edge cases where the + sign may be used in a context that should not be replaced.

const productCode = 'L+12345+X'; // Replace only the `+` that are between words const updatedCode = productCode.replace(/(\\b)\\+(\\b)/g, '$1 $2'); console.log(updatedCode); // "L+12345 X"

decodeURComponent

When dealing with URL parameters, spaces are often encoded as +. To convert them back to spaces, you might need to decode them first using decodeURIComponent.

const encoded = 'search=JavaScript+Tips'; const decoded = decodeURIComponent(encoded); const withSpaces = decoded.replace(/\\+/g, ' '); console.log(withSpaces); // "search=JavaScript Tips"

How to Deal with Different Encodings

When processing URLs or form data, spaces can be encoded as either + or %20. To normalize these to spaces, a two-step approach may be necessary: first, replace + with spaces, then decode the URI component.

function normalizeSpaces(encodedString) { const replacedPlus = encodedString.replace(/\+/g, ' '); return decodeURIComponent(replacedPlus); } const example = 'search=JavaScript+Tips%20and+Tricks'; console.log(normalizeSpaces(example)); // "search=JavaScript Tips and Tricks"

Function Wrapping for Reusability

To handle replacements consistently across an application, you can wrap the replacement logic in a function. This should help with maintainability and readability.

function replacePlusWithSpace(str) { return str.replace(/\+/g, ' '); } const query = 'name=Jane+Doe&action=edit'; console.log(replacePlusWithSpace(query)); // "name=Jane Doe&action=edit"

Advanced Replacement Functions

For complex replacement logic, you can pass a function to String.prototype.replace() instead of a string. This function can contain additional logic to determine what each match should be replaced with.

function complexReplace(match) { // Add any custom logic for the replacement. if (match === '+') { return ' '; // Replace '+' with a space. } // Other custom logic could go here. } const complexString = 'Complex+string+with+1+2+3'; const replacedString = complexString.replace(/\+/g, complexReplace); console.log(replacedString); // "Complex string with 1 2 3"

Let’s say we want to replace the + sign with a space, but only if it's not followed by a number. This kind of logic can be useful when trying to clean up text but where you also want to preserve certain patterns like C++ or algebraic expressions.

function selectiveReplace(match, p1, p2, offset, string) { // p1 is the plus sign, p2 is the following character if any. if (p1 === '+' && isNaN(parseInt(p2))) { return ' '; // Replace '+' with a space if it's not followed by a number. } else { return match; // Otherwise, keep the original match. } } const complexString = 'C++ is more complex+than JavaScript+3'; const replacedString = complexString.replace(/(\+)(.)/g, selectiveReplace); console.log(replacedString); // "C++ is more complex than JavaScript+3"

Here, the selectiveReplace function checks if the + sign is followed by a number. If not, it replaces the + with a space. This preserves instances like 'C++' or '+3' in our string while cleaning up other occurrences of the + sign.

Ship faster, worry less with Basedash

You're busy enough with product work to be weighed down building, maintaining, scoping and developing internal apps and admin panels. Forget all of that, and give your team the admin panel that you don't have to build. Launch in less time than it takes to run a standup.

You're busy enough with product work to be weighed down building, maintaining, scoping and developing internal apps and admin panels. Forget all of that, and give your team the admin panel that you don't have to build. Launch in less time than it takes to run a standup.

You're busy enough with product work to be weighed down building, maintaining, scoping and developing internal apps and admin panels. Forget all of that, and give your team the admin panel that you don't have to build. Launch in less time than it takes to run a standup.

Dashboards and charts

Effortlessly make charts and create a space for your team to work together towards shared goals and metrics.

User CRM

SQL composer with AI

Admin panel

Screenshot of a users table in a database. The interface is very data-dense with information.