【问题标题】:Regex match exact word not preceded or followed by other characters [duplicate]正则表达式匹配未在其他字符之前或之后的确切单词[重复]
【发布时间】:2016-01-07 20:36:09
【问题描述】:

我正在尝试创建一个正则表达式来匹配一组单词。

例如,如果我匹配一组单词 - American Tea

那么在American Tea is awesome. Do you like American Tea? love WowAmerican Tea #American Tea这个字符串中,这里就只有2个匹配项了,

'美国茶很棒。你喜欢美国茶吗?喜欢 WowAmerican Tea #American Tea'

所以,我试图只对单词集进行完全匹配。

我尝试了一些方法,但没有得到正确的正则表达式:( 如果有人可以提供帮助或可以为我指明方向,那将非常有帮助。

检查一下

'American Tea lalalal qwqwqw American Tea sdsdsd #American Tea'.match(/(?:^|\s)(American Tea)(?=\s|$)/g)

这个结果是["American Tea", " American Tea"]

我不想要第二场比赛的空格,我希望比赛结果是["American Tea", "American Tea"]

(第二个美国茶前面没有空格)

【问题讨论】:

  • 那么,你想要 3 场比赛还是 2 场比赛?你说的空间问题是什么?领先的空间?显示代码,你会更清楚你在做什么。一般来说,在JS中,当你需要同时使用lookbehind和lookahead时,你必须使用capturing。喜欢(^|\s)(American Tea)(?=$|\s)这里。
  • 我拥有的是 /(?:^|\s)(American Tea)(?=\s|$)/g 但它有空间问题
  • 它没有任何问题。问题是您如何使用它。正则表达式在 JS 中很差(比 PHP、.NET、Java 等差),但该语言具有弥补它所需的一切。没有代码,这个问题就无法回答。
  • 编辑了问题以添加更多细节
  • 我知道我需要在我拥有的字符串中匹配的单词集。我在我的文本框荧光笔中使用它,以突出显示用户键入时单词的用法。因此,如果他键入像“美国茶”这样的单词集,我想匹配它并突出显示它。所以我不想强调#American Tea

标签: javascript regex


【解决方案1】:

使用.replace() 获得乐趣和利润

/(?:^|\s)(american tea)/ig

https://regex101.com/r/qB0uO2/1

如果您想考虑前缀 AND 后缀:

/(?:^|\s)(american tea)(?:\W|$)/ig 

https://regex101.com/r/qB0uO2/2

JSBIN EXAMPLE

var str = "American Tea is awesome. Do you like American Tea? love WowAmerican Tea #American Tea";

str.replace(/(?:^|\s)(american tea)(?:\W|$)/ig, function(i, m){
  console.log(m);
});

//"American Tea"
//"American Tea"

编辑:

上面只返回匹配项,如果您想保留捕获和匹配的前缀和后缀也为它们使用capturing-groups

var str = "American Tea is awesome. Do you like American Tea? love WowAmerican Tea #American Tea";

var newStr = str.replace(/(^|\s)(american tea)(\W|$)/ig, function(im, p1, p2, p3){
  return  p1 +"<b>"+ p2 +"</b>"+ p3; // p1 and p3 will help preserve the pref/suffix
});

document.getElementById("result").innerHTML = newStr;
&lt;div id="result"&gt;&lt;/div&gt;

parts 在哪里

  • p1 是第一个匹配组(任何前缀)
  • p2 是第二个匹配组(“美国茶”字)
  • p3 是第三个匹配组(任何后缀)

【讨论】:

  • @stribizhev 是的,这正是 OP 想要的。匹配无前缀的美式茶
  • 这将使匹配项为 ["American Tea", "American Tea"] 我需要的是 ["American Tea", "American Tea"](匹配中没有空格)
  • @ghostCoder 查看 jsbin 示例。结果完全正确。
  • 但是 'American Tea lalalal qwqwqw American Tea sdsdsd #American Tea'.match(/(?:^|\s)(american tea)/ig) 给出 ["American Tea", "American Tea "]
  • @ghostCoder 请....jsbin.com/cilosi/1/edit?html,css,js,console,output 看到控制台了吗?你看到任何错误,因为我没有。你在制造问题,而不是我的答案:)
【解决方案2】:

您不需要正则表达式来匹配单词。

我知道一个非常简洁的 CoffeeScript sn-p :

wordList = ["coffeescript", "eko", "talking", "play framework", "and stuff", "falsy"]
tweet = "This is an example tweet talking about javascript and stuff."

wordList.some (word) -> ~tweet.indexOf word # returns true

编译成以下javascript:

var tweet, wordList;

wordList = ["coffeescript", "eko", "talking", "play framework", "and stuff", "falsy"];

tweet = "This is an example tweet talking about javascript and stuff.";

wordList.some(function(word) { // returns true
  return ~tweet.indexOf(word); 
});

~ 不是 CoffeeScript 中的特殊运算符,只是一个很酷的技巧。它是按位 NOT 运算符,它反转其操作数的位。在实践中,它等同于 -x-1。在这里,它的工作原理是我们要检查大于 -1 的索引,并且 -(-1)-1 == 0 的计算结果为 false。

如果您想要匹配的单词,请使用:

wordList.filter (word) -> ~tweet.indexOf word # returns : [ "talking", "and stuff" ]

在 JS 中也一样:

wordList.filter(function(word) { // returns : [ "talking", "and stuff" ]
  return ~tweet.indexOf(word);
});

【讨论】:

  • 此代码是否允许全词搜索(和/或替换)?我在这段代码中没有看到。
  • 全词搜索是什么意思?此代码是否与整个单词不匹配(甚至可以用空格分隔,例如“Ameriacn Tea”)?不知道你在这里的意思
【解决方案3】:

虽然杰里米当然是对的,但我认为你的问题比你人为的例子中可见的要多。

从看起来您正在尝试使用常规 RegEx 单词边界的情况来看,除了您认为“#”是单词字符的一部分。在这种情况下,您可以执行以下操作:(其中 \b 表示“单词边界”)

(^|[^#])\bAmerican Tea\b

或者,如果您只是想列出您认为非单词字符的字符,您可以执行以下操作来模拟单词边界:

(^|[^A-Za-z])American Tea($|[^A-Za-z])

你可以到处玩,例如在http://www.regexr.com/

【讨论】:

    【解决方案4】:

    阅读 cmets,我意识到正则表达式可能不是解决此问题的最佳解决方案。但是,您如何规避 Javascript 不支持积极的后向观察这一事实,这将使这项任务变得容易,这非常有趣。

    如果 JS 具有 (?想要是这样的:

    (?<=\s|\.|,|:|;|\?|\!|^)American Tea(?=\s|\.|,|:|;|\?|\!|$)
    

    在左边,您可以允许任何列出的字符和字符串 ^ 的开头。在右侧,您允许相同的字符和字符串 $ 的结尾。

    但是 Javascript 没有 (?

    (?=(\s|\.|,|:|;|\?|\!|^))\1(American Tea)(?=\s|\.|,|:|;|\?|\!|$)
    

    这个正则表达式用积极的前瞻代替积极的后瞻。然后它将在前瞻中找到的任何内容与 \1 匹配,最后 American Tea 将进入捕获组 1。

    演示:https://regex101.com/r/qX9qR3/3

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2016-12-01
      • 2014-03-14
      • 2012-06-23
      • 2015-10-28
      • 2017-12-23
      相关资源
      最近更新 更多