7

我想我不太擅长正则表达式,所以这是我的问题(我确定这很容易解决,但不知何故我似乎找不到如何解决)

var word = "aaa";
text = text.replace( new RegExp(word, "g"),
                     "<span style='background-color: yellow'>"+word+"</span>");

这在大多数情况下都有效。

我想要做的是正则表达式只有在 word 后面没有 char /并且前面没有 char "时才能工作。

4

3 回答 3

14

您将要使用负前瞻。

正则表达式:'[^"]' + word + '(?!/)'

编辑:虽然看起来你已经通过避免后视找到了答案并不重要,但 Rohit 注意到了一些我没有注意到的东西。您将需要捕获 [^\"] 并将其包含在替换中,这样它就不会被丢弃。这对于查找头来说不是必需的,因为根据定义,环视不包含在捕获中.

于 2012-12-24T08:43:22.677 回答
3

你可以使用这个正则表达式: -

'([^"])' + word + '(?!/)'

并将其替换为 -"$1g"

请注意,Javascript 不支持后视。"因此,您需要使用否定字符类捕获前一个字符并确保它不是。

请参阅http://fiddle.re/zdjt上的演示

于 2012-12-24T08:53:30.367 回答
0

首先,这个问题可以解释为

  1. 匹配单词不在前面AND不后面"aaa并且aaa/应该匹配,与 相同"aaa/)和 as
  2. 匹配单词前面没有后面没有一些字符("aaaaaa/不应该匹配,而"aaa/应该)。

如果您使用的是支持 ECMAScript 2018的 JavaScript 环境,则可以使用后视解决方案:

const word = 'aaa',                     // Word to find
    left = '"',                         // Left-hand negative marker
    right = '/',                        // Right-hand negative marker
    text = 'aaa aaa/ "aaa "aaa/ aaaaa'; // Test string

// Relace any 'word' that does not start with " OR does not end with /
var regex = new RegExp(String.raw`\b(?<!${left})${word}\b(?!${right})`, 'g')
console.log( text.replace(regex, "<span style='background-color: yellow'>$&</span>") );
// => <span style='background-color: yellow'>aaa</span> aaa/ "aaa "aaa/ aaaaa

// Replace any 'word' that does not start with " AND does not end with /
var regex = new RegExp(String.raw`\b${word}\b(?!(?<=${left}${word})${right})`, 'g')
console.log( text.replace(regex, "<span style='background-color: yellow'>$&</span>") );
// => <span style='background-color: yellow'>aaa</span> <span style='background-color: yellow'>aaa</span>/ "<span style='background-color: yellow'>aaa</span> "aaa/ aaaaa

如果您使用的是不支持ECMAScript 2018的 JavaScript 环境,您可以使用

var word = 'aaa',                       // Word to find
    left = '"',                         // Left-hand negative marker
    right = '/',                        // Right-hand negative marker
    text = 'aaa aaa/ "aaa "aaa/ aaaaa'; // Test string

// Relace any 'word' that does not start with " OR does not end with /, one match expected
var regex = new RegExp("([^" + left + "\\w]|^)(" + word + ")\\b(?!" + right + ")", 'g')
console.log( text.replace(regex, "$1<span style='background-color: yellow'>$2</span>") );
// => <span style='background-color: yellow'>aaa</span> aaa/ "aaa "aaa/ aaaaa

// Same as above, but in case "left" is a sequence of chars, not a single char, or a longer pattern:
var regex = new RegExp("(" + left + ")?\\b(" + word + ")\\b(?!" + right + ")", 'g')
console.log( text.replace(regex, function(x,g,gg) { return g ? x : "<span style='background-color: yellow'>" + gg + "</span>";}) );
// => <span style='background-color: yellow'>aaa</span> aaa/ "aaa "aaa/ aaaaa

// Replace any 'word' that does not start with " AND does not end with /, three matches expected
var regex = new RegExp("(" + left + word + right + ")|\\b" + word + "\\b", 'g')
console.log( text.replace(regex, function(x, g) { return g || "<span style='background-color: yellow'>" + x + "</span>";}) );
// => <span style='background-color: yellow'>aaa</span> <span style='background-color: yellow'>aaa</span>/ "<span style='background-color: yellow'>aaa</span> "aaa/ aaaaa

笔记:

  • 我在这里通过\b, 单词边界使用整个单词匹配(并\w在其中一种解决方法中在否定字符类中构造)
  • 如果rightleft字符/字符串包含特殊的正则表达式元字符,请注意在用作正则表达式的一部分之前对其进行转义
  • word变量可能会出现相同的转义需求,但在这种情况下,如果word以特殊的正则表达式元字符开头或/和结尾,则单词边界 ( \b) 将不再起作用,您将需要使用自适应/动态单词边界
于 2021-11-21T17:25:53.673 回答