0

你能帮我么。如何(?<=^|\s):d(?=$|\s)在 javascript RegExp 中添加此正则表达式?

例如

regex = new RegExp("?????" , 'g');

我想替换表情符号:d,但前提是它被空格包围(或在字符串的末尾)。

4

2 回答 2

3

首先,正如 Some1.Kill.The.DJ 提到的,我建议您使用文字语法来创建正则表达式:

var pattern = /yourPatternHere/g;

它更短,更容易阅读,并且避免了转义序列的复杂性。

该模式不起作用的原因是JavaScript不支持lookbehinds ( (?<=...)。所以你必须找到一个解决方法。你不会在你的模式中包含那个字符:

var pattern = /(?:^|\s):d(?!\S)/g;

因为无论如何在你的模式中捕获任何东西都没有用(因为:d是固定的)你可能只对匹配的位置感兴趣。这意味着,当您找到匹配项时,您必须检查第一个字符是否是空格字符(或不是:)。如果是这种情况,您必须将位置增加1. 如果您知道您的输入字符串永远不能以空格开头,那么您可以简单地增加任何找到的位置(如果不是)0

请注意,我稍微简化了您的前瞻。这实际上是您不必区分字符串结尾和特定字符类型的环视之美。只需使用负前瞻,并确保前面没有非空格字符。

仅供将来参考,这意味着您可以将初始模式简化为:

(?<!\S):d(?!\S)

(如果您使用的正则表达式引擎支持lookbehinds。)

编辑:

在您对另一个答案发表评论后,使用该解决方法实际上要容易得多。只需写回捕获的空格字符:

string = string.replace(/(^|\s):d(?!\S)/g, "$1emoticonCode");

where$1指的是匹配的内容(^|\s)。即如果匹配是在字符串的开头$1将是空的,并且如果之前有一个空格:d,那么$1将包含那个空格字符。

于 2012-12-09T16:08:03.503 回答
1

Javascript不支持lookbehindie (?<=)..

它支持lookahead

更好的使用

/(?:^|\s)(:d)(?=$|\s)/g

Group1捕获所需的匹配

于 2012-12-09T16:01:51.323 回答