'regex to remove number (year only) from string

I know the regex that separates two words as following:

input:

'WonderWorld'

output:

'Wonder World'

"WonderWorld".replace(/([A-Z])/g, ' $1');

Now I am looking to remove number in year format from string, what changes should be done in the above code to get:

input

'WonderWorld 2016'

output

'Wonder World'


Solution 1:[1]

You can match the location before an uppercase letter (but excluding the beginning of a line) with \B(?=[A-Z]) and match the trailing spaces if any with 4 digits right before the end (\s*\b\d{4}\b). In a callback, check if the match is not empty, and replace accordingly. If a match is empty, we matched the location before an uppercase letter (=> replace with a space) and if not, we matched the year at the end (=> replace with empty string). The four digit chunks are only matched as whole words due to the \b word boundaries around the \d{4}.

var re = /\B(?=[A-Z])|\s*\d{4}\b/g; 
var str = 'WonderWorld 2016';
var result = str.replace(re, function(match) {
  return match ? "" : " ";
});
document.body.innerHTML = "<pre>'" + result + "'</pre>";

A similar approach, just a different pattern for matching glued words (might turn out more reliable):

var re = /([a-z])(?=[A-Z])|\s*\b\d{4}\b/g; 
var str = 'WonderWorld 2016';
var result = str.replace(re, function(match, group1) {
  return group1 ? group1 + " " : "";
});
document.body.innerHTML = "<pre>'" + result + "'</pre>";

Here, ([a-z])(?=[A-Z]) matches and captures into Group 1 a lowercase letter that is followed with an uppercase one, and inside the callback, we check if Group 1 matched (with group1 ?). If it matched, we return the group1 + a space. If not, we matched the year at the end, and remove it.

Solution 2:[2]

Try this:

"WonderWorld 2016".replace(/([A-Z])|\b[0-9]{4}\b/g, ' $1')

Solution 3:[3]

How about this, a single regex to do what you want:

"WonderWorld 2016".replace(/([A-Z][a-z]+)([A-Z].*)\s.*/g, '$1 $2');
"Wonder World"

get everything apart from digits and spaces.

Solution 4:[4]

re-code of @Wiktor Stribi?ew's solution:

str can be any "WonderWorld 2016" | "OneTwo 1000 ThreeFour" | "Ruby 1999 IamOnline"

str.replace(/([a-z])(?=[A-Z])|\s*\d{4}\b/g, function(m, g) {
  return g ? g + " " : "";
});

Solution 5:[5]

import re

remove_year_regex = re.compile(r"[0-9]{4}")

Test regex expression here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 Wiktor Stribiżew
Solution 4 Zeeshan Hassan Memon
Solution 5 Rachel