从字符串中删除年份数字(仅限年份)的正则表达式

3
我知道将两个单词分开的正则表达式如下所示:

输入:

'WonderWorld'

输出:

'Wonder World'

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

现在我想从字符串中删除年份格式的数字,应该对上述代码进行哪些更改才能得到以下结果:
输入
'WonderWorld 2016'

输出
'Wonder World'

你应该使用.replace(/([A-Z][a-z]+)(.+)/g, '$1 $2');来分离两个单词。 - buræquete
5个回答

2
您可以使用\B(?=[A-Z])匹配大写字母前的位置(但不包括行首),并使用\s*\b\d{4}\b匹配末尾的任何四个数字。在回调中,检查匹配是否为空,并相应地替换。如果match为空,则我们匹配了大写字母前面的位置(=> 替换为空格),如果不是,则我们匹配了末尾的年份(=> 替换为空字符串)。由于\d{4}周围有\b单词边界,因此仅将四位数字块作为整个单词进行匹配。

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>";

一种类似的方法,只是使用不同的模式来匹配粘合的单词(可能更可靠):

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>";

这里,([a-z])(?=[A-Z])匹配并捕获了一个小写字母,后面跟着一个大写字母,并将其放入第一组。在回调函数中,我们检查第一组是否匹配(使用group1 ?)。如果匹配,我们返回group1 + 一个空格。如果没有匹配,则说明匹配到了末尾的年份,并将其删除。

我建议的解决方案基于假设,与你的一样。我的假设是字符串末尾的年份(4位数字)应该被删除。如果不是这样,$ 应该被替换为 \b。这是一个正则表达式解决方案,我只需使用 | 运算符添加交替。所有替换都在处理一个正则表达式时完成,因此它是一个1-regex通行证。 - Wiktor Stribiżew
1
这是可行的解决方案,我将 $ 替换为 \b 以传递 'WonderWorldGoodHlu 0000 FrankyDrank',谢谢。 - Zeeshan Hassan Memon
感谢您的准确说明,我已更新答案以使其按预期工作。 - Wiktor Stribiżew

2

试试这个:

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

@bureaquete 我已经修改成一个正则表达式。 - Adam
'WonderWorldGoodHlu 0000 FrankyDrank' 不符合您的正则表达式。 - Zeeshan Hassan Memon

1

这样如何,一个正则表达式就能实现你想要的功能:

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

获取除数字和空格之外的所有内容。

WonderWorld NEW! 怎么办?它不是以年份结尾,但 NEW 将被移除。请查看 演示 - 这个解决方案无效。请修复。 - Wiktor Stribiżew
不,'WonderWorld 2016a'与我的解决方案完美配合 -> 'Wonder World 2016a'。最后的“2016a”没有被删除,因为它不是一年。一年是一个四位数字,不是一个字母数字字符串。您的解决方案会将结尾的所有内容都删除。@Zeeschan:您确定这就是所需的吗? - Wiktor Stribiżew
你的正则表达式只适用于两个字符串,不够通用。顺便说一句,谢谢。 - Zeeshan Hassan Memon

0

0

对@Wiktor Stribiżew的解决方案进行重新编码:

str可以是任何“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 + " " : "";
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接