【问题标题】:Regex match apostrophe inside, but not around words, inside a character set正则表达式匹配字符集中的撇号,但不在单词周围
【发布时间】:2022-01-07 17:39:15
【问题描述】:

我正在使用 JavaScript 中的正则表达式计算不同单词在文本中出现的次数。我的问题是当我引用了单词时:'word' 应该简单地算作word(不带引号,否则它们会表现为两个不同的单词),而 it's 应该算作一个完整的单词。

(?<=\w)(')(?=\w)

这个正则表达式可以识别内部的撇号,但不能识别单词周围的撇号。问题是,我不能在 [\w]+ 等字符集中使用它。

(?<=\w)(')(?=\w)|[\w]+

it's a 'miracle' of nature 计为 7 个单词,而不是 5 个(it's 成为 3 个不同的单词)。另外,第三个单词应该简单地选择为miracle,而不是'miracle'

为了让事情变得更复杂,我还需要捕捉变音符号,所以我使用[A-Za-zÀ-ÖØ-öø-ÿ] 而不是\w

我怎样才能做到这一点?

【问题讨论】:

    标签: javascript regex diacritics apostrophe single-quotes


    【解决方案1】:

    您可以交替使用 2 个捕获组,然后检查这些组的值。

    (?<!\S)'(\S+)'(?!\S)|(\S+)
    
    • (?&lt;!\S)' 否定后视,在左侧断言空白边界并匹配 '
    • (\S+) 捕获组 1,匹配 1+ 个非空白字符
    • '(?!\S) 匹配 ' 并在右侧声明一个空白边界
    • |或者
    • (\S+) 捕获组 2,匹配 1+ 个非空白字符

    查看regex demo

    const regex = /(?<!\S)'(\S+)'(?!\S)|(\S+)/g;
    const s = "it's a 'miracle' of nature";
    
    Array.from(s.matchAll(regex), m => {
      if (m[1]) console.log(m[1])
      if (m[2]) console.log(m[2])
    });

    【讨论】:

    • 奇怪的是,在 regex101.com 中它包含了 'miracle' 中的撇号,但这里没有...
    • @Rodrigo 它是“匹配的”,但未在组中捕获。您可以在正则表达式演示 regex101.com/r/me4Plt/1 中看到以绿色和橙色突出显示的捕获的和最终使用的值
    • 哦,我明白了。谢谢!
    【解决方案2】:

    1)你可以简单地使用/[^\s]+/g正则表达式

    const str = `it's a 'miracle' of nature`;
    const result = str.match(/[^\s]+/g);
    
    console.log(result.length);
    console.log(result);

    2) 如果您正在计算字符串中的总字数,那么您也可以使用split 作为:

    const str = `it's a 'miracle' of nature`;
    const result = str.split(/\s+/);
    
    console.log(result.length);
    console.log(result);

    3)如果你想要一个在开头和结尾没有quote的单词,那么你可以这样做:

    const str = `it's a 'miracle' of nature`;
    const result = str.match(/[^\s]+/g).map((s) => {
      s = s[0] === "'" ? s.slice(1) : s;
      s = s[s.length - 1] === "'" ? s.slice(0, -1) : s;
      return s;
    });
    
    console.log(result.length);
    console.log(result);

    【讨论】:

    • 对不起,我说得不够清楚:'miracle' 应该算作miracle(不带引号),否则它们会显示为两个不同的词。
    • 仍然有效。总数为5
    • 对不起,我又不够清楚了!我的最终目标是计算每个单词重复的次数。因此,任何单词都不应出现引用,否则它将成为不同的单词。
    • @Rodrigo 那么您的预期结果应该是什么?您应该在问题本身中指定它
    • 5 ["it's", "a", "miracle", "of", "nature"]miracle 必须不加引号。
    猜你喜欢
    • 2023-03-26
    • 2023-04-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多