Javascript正则表达式适用于某些字符之间的所有单词

时间:2012-05-04 11:42:43

标签: javascript regex

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

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

我在最后四个单词中得到4分。

这适用于.net:

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

如果您需要在主文本后面加上方括号中带有文字的备选方案,则可以将其添加为第二个备选方案,当前第二个方案将成为第三个备选方案。
这有点复杂,但我现在想不出更好的解决方案。

如果您需要对实际匹配执行某些操作,您将在捕获组中找到它们。

<强>更新

说明: 所以,我们在这里有两个选择:

  1. \[[^\]]+\](?:^|\s)([\w']+)(?!\])\b
  2. 这就是说:

    • \[[^\]]+\] - 匹配方括号中的所有内容(不捕获)
    • (?:^|\s) - 接着是行开头或空格 - 当我看到它时,现在把插入符号删掉,因为它没有意义所以这将只是\s
    • ([\w']+) - 匹配所有后续字符,只要(?!\])下一个字符不是结束括号 - 这现在可能也是不必要的,所以让我们尝试删除前瞻
    • \b - 并匹配字边界

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

克里斯,恢复这个问题,因为它有一个简单的解决方案,没有提到。 (在针对how to exclude patterns in regex的一般性问题进行一些研究时找到了您的问题。)

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

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

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

此程序显示如何使用正则表达式(请参阅online demo中的计数结果):

<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>

参考

How to match (or replace) a pattern except in situations s1, s2, s3...