0

我试图返回方括号之间的所有单词的计数。所以给..

[don't match these words] but do match these

最后四个单词我数到 4。

这适用于.net:

\b(?<!\[)[\w']+(?!\])\b

但它在 Javascript 中不起作用,因为它不支持后视

纯 js 正则表达式解决方案的任何想法?

4

3 回答 3

5

好的,我认为这应该有效:

\[[^\]]+\](?:^|\s)([\w']+)(?!\])\b|(?:^|\s)([\w']+)(?!\])\b

你可以在这里测试它:
http ://regexpal.com/

如果您需要在正文之后使用方括号中的文本替代,可以将其添加为第二个替代,当前的第二个将成为第三个。
这有点复杂,但我现在想不出更好的解决方案。

如果您需要对实际匹配做一些事情,您会在捕获组中找到它们。

更新:

解释:所以,我们在这里有两个选择:

  1. \[[^\]]+\](?:^|\s)([\w']+)(?!\])\b

这是在说:

  • \[[^\]]+\]- 匹配方括号中的所有内容(不要捕获)
  • (?:^|\s)- 后跟行开头或空格 - 当我看它时,现在将插入符号取出,因为它没有意义,所以这将变得公正\s
  • ([\w']+)- 只要(?!\])下一个字符不是右括号,就匹配所有后面的单词字符 - 现在这可能也是不必要的,所以让我们尝试删除前瞻
  • \b- 并匹配单词边界

2(?:^|\s)([\w']+)(?!\])\b

如果您找不到选项 1 - 只进行单词匹配,而无需寻找方括号,因为我们在第一部分确保它们不在这里。

好的,所以我删除了所有我们不需要的东西(他们留在那里,因为我在它起作用之前尝试了很多选项:-),修改后的正则表达式如下:

\[[^\]]+\]\s([\w']+)(?!\])\b|(?:^|\s)([\w']+)\b
于 2012-05-04T12:29:15.793 回答
1

我会使用类似\[[^\]]*\]删除方括号之间的单词,然后按空格分解返回的字符串来计算剩余的单词。

于 2012-05-04T11:45:50.990 回答
0

克里斯,重新提出这个问题,因为它有一个没有提到的简单解决方案。(在对有关如何在 regex 中排除模式的一般问题进行一些研究时发现了您的问题。)

这是我们的简单正则表达式(在 regex101 上查看它,查看右下面板中的组捕获):

\[[^\]]*\]|(\b\w+\b)

左边的交替匹配完成[bracketed groups]。我们将忽略这些匹配。右侧匹配并捕获第 1 组的单词,我们知道它们是正确的单词,因为它们没有被左侧的表达式匹配。

该程序展示了如何使用正则表达式(参见在线演示中的计数结果):

<script>
var subject = '[match ye not these words] but do match these';
var regex = /\[[^\]]*\]|(\b\w+\b)/g;
var group1Caps = [];
var match = regex.exec(subject);

// put Group 1 captures in an array
while (match != null) {
    if( match[1] != null ) group1Caps.push(match[1]);
    match = regex.exec(subject);
}


document.write("<br>*** Number of Matches ***<br>");
document.write(group1Caps.length);

</script>

参考

如何匹配(或替换)模式,除了情况 s1、s2、s3...

于 2014-05-21T06:48:44.367 回答