正则表达式:如何分割和替换包含数字的字符串?

3

我需要一个正则表达式,在单词或一组单词的开头和结尾加上星号(*),但不包括单独的数字。带有字母的数字是可以的。很难解释,以下是一些例子:

123 Ballister 1 Block           --> 123 *Ballister* 1 *Block*

B@llister Place 123 Block N2 45 --> *B@llister Place* 123 *Block N2* 45

123 B@llister# abc              --> 123 *B@llister# abc*

我尝试使用以下方法:

var sample = "@sample 22 @sample2 xyz1";
var x = sample.replace(/[^0-9 ]+/g, function(str) {
    return "*"+str.trim()+"*";
});

但是它没有起作用。我希望有人能帮助我。


N2 为什么是有效的? - EagerToLearn
任何单词或一组单词都可以添加星号,例如:N2, 这是一个测试, 这是一个测试#01, abc123这些都是包含数字或字符的单词或单词组,我需要在匹配项的开头和结尾添加星号,但不包括单独的数字。 - Miguel Reyes
1个回答

4

下面是一个可行的示例:

/((?!\d+\b)\S(?:\S| \D)*)/

替换字符串只是一个简单的操作。
*$1*

这里有一个演示

这些例子的工作原理如下:

123 Ballister 1 Block
--> 123 *Ballister* 1 *Block*

B@llister Place 123 Block N2 45
--> *B@llister Place* 123 *Block N2* 45

123 B@llister# abc
--> 123 *B@llister# abc*

@rmani empory 123
--> *@rmani empory* 123

#1smple 22 #sample2 #xyz1
--> *#1smple* 22 *#sample2 #xyz1*

解释

我们想要匹配整个单词或一组单词,但排除完全由数字组成的单词。所以...

  • (开始捕获
    • (?!\d+\b)不匹配完全是数字的单词
    • \S需要一个非空格字符(这样我们就不会匹配abc def中的* def*
    • (?:\S| \D)非空格字符或空格和非数字之一
    • *零次或多次
  • )停止捕获

综合起来

你可以按如下方式使用它:

var sample = "@sample 22 @sample2 xyz1";
var x = sample.replace(/((?!\d+\b)\S(?:\S| \D)*)/g, '*$1*');

实时演示:

var input = document.getElementsByTagName('input')[0],
        output = document.getElementsByTagName('span')[0];

input.onkeyup = function (elem) {
    output.innerHTML = input.value.replace(/((?!\d+\b)\S(?:\S| \D)*)/g, '*$1*');
};
<p>
    Original Text: <input />
</p>
<p>
    Replacement: <span />
</p>


非常感谢您,Ed!这几乎就是我需要的!只有在以下情况下才会失败:@rmani empory 123 // 预期结果:*@rmani empory* 123 #1smple 22 #sample2 #xyz1 // 预期结果:*#1smple* 22 *#sample2 #xyz1* - Miguel Reyes
我忘记在我的原始问题中添加单词或一组单词开头的特殊字符情况,对此很抱歉。希望您能帮助我,因为我真的不擅长正则表达式。 - Miguel Reyes
@StefanDochow 你不可以编辑代码。请使用注释来发表评论,不要更改帖子。 - elixenide
@StefanDochow 没问题。 - elixenide
@EdCottrell,又有一个问题...您如何成为正则表达式方面的高手?有什么资源或书籍可以推荐给我吗?还是熟能生巧?呵呵 - Miguel Reyes
显示剩余7条评论

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