我试图使用@符号作为指示变量来交换字符串的方法,但我还想在文本字符串中包含@符号。
Hello @website, you can email me at email@@website.com
鉴于此代码,它会找到 - 替换@website,并留下任何双@@的实例;但是,由于JavaScript不支持负面反馈,我不知道如何修改以下正则表达式以不选择double @@的实例:
@([a-z0-9]+)
Hello Patrick, you can email me at email@website.com
注意@@如何变成单个@,这是我确定在找到第一步后能够处理的操作。
答案 0 :(得分:2)
您可以添加其他群组并匹配非@
的内容:
/(^|[^@])@([a-z0-9]+)/
然后在替换中恢复组1,àla:
var result = input.replace(/(^|[^@])@([a-z0-9]+)/g, function (_, before, name) {
return before + swap[name];
});
然而,这使得代表@@@somevariable
变得不可能,所以我建议您创建一些规则:
var TOKEN = /@@|@([a-z0-9]+)|[^@]+|@/g;
var result = '';
var m;
while (m = TOKEN.exec(input)) {
if (m[0] === '@@') {
result += '@';
} else if (m[1]) {
result += swap[m[1]];
} else {
result += m[0];
}
}
你当然可能不需要那个......
答案 1 :(得分:1)
这是你正在寻找的吗?
var subject = "Hello @website, you can email me at email@@website.com";
var result = subject.replace(/(.*?)(@\w+)(.*?)[@]{1}(\w+)/img, "$1Patrick$3$4");
//Hello Patrick, you can email me at email@website.com
答案 2 :(得分:0)
根据你到目前为止提到的内容,这是一种可能性。
var str = 'Hello @website, you can email me at email@@website.com';
var word = 'Patrick';
var result = str.replace(/(^|[^@])(@[a-z0-9]+)/i, '$1' + word).replace(/@{2,}/, '@');
console.log(result);
// output: Hello Patrick, you can email me at email@website.com
以下是fiddle