【问题标题】:javascript regex match word not followed by pattern with text inbetweenjavascript正则表达式匹配单词不跟随模式,中间有文本
【发布时间】:2012-12-16 18:23:37
【问题描述】:

文本:

id="word1 word2 word3/343/els/425/word4 word5 word6"
wordA wordB Bword2B word1 word2 word3
blah blah blah

我正在尝试匹配整个单词:文本中的 word1、word2、word3 但我不希望它们在文本的 id="word1 word2 word3/343/els/425/word4 word5 word6" 行中匹配,这些词不是拉丁文。

目前的做法:

var sWord = "word2";
text = text.replace( new RegExp(sWord+"(?!\/[0-9])", "gi"), "<span style='background-color: yellow'>"+sWord+"</span>");

这种方法只适用于 word3,不适用于 word1 或 word2,那么我如何在正则表达式中引入 NUMBER 之前还有另一个词的可能性?

"(?!.\/[0-9])"

我添加了点“。”到正则表达式。但它似乎不起作用。

另外,如何添加全词匹配的可能性? \b\S 似乎不起作用,因为单词不是拉丁语。

提前谢谢你!

编辑: jsfiddlehttp://jsfiddle.net/GLt4F/5/

您可以看到 word1 和 word2 的按钮中断,但 word3 的按钮中断,因为匹配正确

EDIT2:

重新表述问题:仅匹配 AAA 如果后面没有 BBB,并且它们之间可以是任何东西。例如:

AAA frefe BBB 不应该匹配
AAA BBB 不应该匹配
AAA frefe cc 应该匹配

【问题讨论】:

  • 任何机会我们都可以得到一个 jsfiddle,我们可以用它来测试可能的解决方案:)
  • 不确定其他人,但我无法理解您要达到的目标。 “我不希望它们在“id = blahblah”中匹配”是什么意思。 word1 永远不会匹配 blahblah。需要更好的解释
  • 为什么不在模式匹配之前去掉id="..."
  • @VladL 文本在显示之前是 HTML。所以我想在 html 中突出显示 word2,但我不想在 id="word1 etc." 中更改它。因为它会破坏 javascript 功能。 blahblah 是我发布的整行的缩写。
  • 你的意思是这样的吗? jsfiddle.net/PBu7S

标签: javascript regex


【解决方案1】:
/AAA([\s\S](?!=BBB))*$/

应该这样做。

另外,如何添加全词匹配的可能性? \b 和 \S 似乎不起作用,因为单词不是拉丁语。

JavaScript 没有 unicode 兼容模式,所以你必须为一个单词 char 编写自己的字符集并使用负匹配,所以

(?:^|[^A-Za-z0-9_$])

在 AAA 之前,并且在 JS 中没有后退,因此之前的非单词 char 将成为捕获组 0 的一部分。

【讨论】:

    【解决方案2】:
    (?!(.*)\/[0-9])
    

    这似乎可以解决问题(因为介于两者之间时不匹配。不知道是否存在漏洞或者它是否是一个可靠的答案。

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多