Javascript 在输出中使用str.replace()输入

Javascript 在输出中使用str.replace()输入,javascript,regex,string,replace,Javascript,Regex,String,Replace,在JavaScript中,如何在新字符串中使用全部或部分匹配字符串。例如:我有以下两个字符串: var str1 = "Hello, my name is Vinnie Caprarola"; var str2 = "Hello, my name is John Doe"; var str3 = "Hello, my name is very weird"; 我想用span元素包围这些名称,所以对名称应用“name”类。假设这不是字符串的全部,并且可能在前后都有字符。另外,就像在str3中一样

在JavaScript中,如何在新字符串中使用全部或部分匹配字符串。例如:我有以下两个字符串:

var str1 = "Hello, my name is Vinnie Caprarola";
var str2 = "Hello, my name is John Doe";
var str3 = "Hello, my name is very weird";
我想用span元素包围这些名称,所以对名称应用“name”类。假设这不是字符串的全部,并且可能在前后都有字符。另外,就像在str3中一样,如果“Hello,my name is”后面的部分没有大写,我应该假设它不是一个名称,并忽略它。因此,我的问题是:如何在所有这些字符串上运行完全相同的函数并获得此输出:

var str1 = "Hello, my name is <span>Vinnie Caprarola</span>";
var str2 = "Hello, my name is <span>John Doe</span>";
var str3 = "Hello, my name is very weird";

因此,我需要将名称替换为基本上+name+。如何在上一个表达式中获得名称?

我找到了答案

正如我所读到的,您可以指定一个函数作为替换参数,并在该函数中进行匹配。因此,使函数如下所示:

function doTheReplace(match) {
  return '<span>' + match + '</span>';
}

str1.replace(/Hello\, my name is [A-Z].* [A-Z].* /, doTheReplace);
str2.replace(/Hello\, my name is [A-Z].* [A-Z].* /, doTheReplace);
str3.replace(/Hello\, my name is [A-Z].* [A-Z].* /, doTheReplace);

这将产生所请求的输出。

此函数应能完成此操作

string.replace(/(?!^)([A-Z]\w+ ?)+/g, '<span>$&</span>');
这是一个良好的开端:

var str1 = "Hello, my name is Vinnie Caprarola";
var str2 = "Hello, my name is John Doe";
var str3 = "Hello, my name is very weird";
var str4 = "Hello, my name is Louis van Gaal";

var re = /Hello,\smy\sname\sis\s([A-Z]\w+.*[A-Z]\w+)/;
function addSpan(origStr) {
    return origStr.replace(re, 'Hello, my name is <span>$1</span>');
};

console.log(addSpan(str1)); //Hello, my name is <span>Vinnie Caprarola</span> 
console.log(addSpan(str2)); //Hello, my name is <span>John Doe</span> 

console.log(addSpan(str3)); //Hello, my name is very weird 
console.log(addSpan(str4)); //Hello, my name is <span>Louis van Gaal</span>
您可以在此处使用JSFIDLE:

希望这能让你开始。使用关于regex:的MDN文章,可以获得javascript正则表达式的权威指南


@nicklaw,你的答案很接近,但问题是除了这部分字符串之外,可能还有更多的内容。因此,你不能确定每个大写的单词后面跟着另一个大写的单词就是一个名字。

这正是你需要回答的问题,而不是问:计算机如何知道John Doe就是你所说的名字,非常奇怪的是不是?他们想要一个只匹配大写名称的正则表达式。你可以使用这样的正则表达式:但我认为它可能太过了brittle@Jon-我假设如果它大写,它就是一个名称。这只是问题的一个例子。我正在做的实际事情要复杂得多,但我只想从这个问题中得到我需要的东西。@VinnieCaprarola:我非常怀疑你能否从一个模糊的问题中得到你需要的东西。另外,如果照字面理解,你的假设显然是不正确的——路易斯·范加尔是一个简单的例子。很接近,如果你使用这个正则表达式/[A-Z][A-Z]*[A-Z][A-Z]*/那么它就行了。这是一个演示哦,哎呀,我没注意到他想要一个完整名字的跨度。我会更新的。事实上,如果你稍微把它改成/[A-Z][A-Z\s]*[A-Z][A-Z\s]*/那么你就可以得到路易斯·范加尔的例子:这对像我的名字路易斯·范加尔这样的长字符串是不起作用的。下面是你安抚大都会的方法:/[A-Z][A-Z\s\\\\']*[A-Z][A-Z\s\\\']*/演示:它也适用于较长的名称:其中一条评论提到字符串将更加复杂,我认为这意味着它不一定以Hello开头,我的名字是。。。虽然不是很完美,但我想我会处理更多的用例。那串呢?我住在旧金山,你好,我叫Bob Johnson。这个函数只适用于Bob Johnson。但是它不适用于Hi,叫我Bob Johnson。只要字符串不变,你的是对的。OP说,我假设如果它是大写的,它就是一个名字。不需要说,但打破这个很简单:你好,我的名字是杰克,我住在巴塞罗那等等。