0

regex:

/@([\S]*?(?=\s)(?!\. ))/g

given string:

'this string has @var.thing.me two strings to be @var. replaced'.replace(/@([\S]*?(?=\s)(?!\. ))/g,function(){return '7';})

expected result:

'this string has 7 two strings to be 7. replaced'

In case you want to make it "better" I'm trying to match Razor Html Encoded Expressions but mind the case about not matching an ending period followed by a space. The test case above shows that with the second (shorter) @var, whereas the first captures as @var.thing.me

4

3 回答 3

2

尝试使用以下正则表达式:

var input = 'this string has @var.thing.me two strings to be @var. replaced';
input.replace(/(@[a-z][a-z.]+[a-z])/gi, function(){
  return '7';
});

此正则表达式(@[a-z]([a-z.]+[a-z])*)匹配@,然后是字母(如果 之后不能有点@),然后是字母或点和字母在最后。

i修饰符允许使正则表达式不区分大小写。

于 2013-01-18T08:33:06.583 回答
1

您的模式限制性不够,即它捕获了太多。示例字符串中的最后一个@var.(包括点)被捕获,因为它后面跟着一个空格(正向前瞻所要求的),此外,它后面没有一个点和一个空格(负前瞻所要求的) . 你可以试试这个模式:

/@([\S]*?)(?=[.]?\s)/g

它将匹配@something子字符串(可以包含点字符),当它后面跟着一个空格(就像它在字符串的第一个匹配中发生的那样)以及它后面跟着一个点和空格时(就像它在第二个匹配中发生的那样)你的字符串匹配)。在铬浏览器控制台中测试它似乎工作正常:

> 'this string has @var.thing.me two strings to be @var. replaced'.replace(/@([\S]*?)(?=[.]?\s)/g,function(){return '7';})
"this string has 7 two strings to be 7. replaced"
于 2013-01-18T09:32:40.923 回答
0

尝试这个

@((?!\. )\S)+

在 regexr 上查看

这匹配 a@后跟非空白字符\S。但它只匹配下一个非空格,如果它不是一个点后跟一个空格。 (?!\. )是由\S.

于 2013-01-18T09:03:33.557 回答