查找并替换@foo的实例,但不是@@ foo

时间:2014-04-24 18:39:29

标签: javascript regex replace

我试图使用@符号作为指示变量来交换字符串的方法,但我还想在文本字符串中包含@符号。

例如:

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

注意@@如何变成单个@,这是我确定在找到第一步后能够处理的操作。

3 个答案:

答案 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 

http://regex101.com/r/hI3jH5

答案 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