我试图返回方括号之间的所有单词的计数。所以给..
[don't match these words] but do match these
最后四个单词我数到 4。
这适用于.net:
\b(?<!\[)[\w']+(?!\])\b
但它在 Javascript 中不起作用,因为它不支持后视
纯 js 正则表达式解决方案的任何想法?
我试图返回方括号之间的所有单词的计数。所以给..
[don't match these words] but do match these
最后四个单词我数到 4。
这适用于.net:
\b(?<!\[)[\w']+(?!\])\b
但它在 Javascript 中不起作用,因为它不支持后视
纯 js 正则表达式解决方案的任何想法?
好的,我认为这应该有效:
\[[^\]]+\](?:^|\s)([\w']+)(?!\])\b|(?:^|\s)([\w']+)(?!\])\b
你可以在这里测试它:
http ://regexpal.com/
如果您需要在正文之后使用方括号中的文本替代,可以将其添加为第二个替代,当前的第二个将成为第三个。
这有点复杂,但我现在想不出更好的解决方案。
如果您需要对实际匹配做一些事情,您会在捕获组中找到它们。
更新:
解释:所以,我们在这里有两个选择:
\[[^\]]+\](?:^|\s)([\w']+)(?!\])\b
这是在说:
\[[^\]]+\]
- 匹配方括号中的所有内容(不要捕获)(?:^|\s)
- 后跟行开头或空格 - 当我看它时,现在将插入符号取出,因为它没有意义,所以这将变得公正\s
([\w']+)
- 只要(?!\])
下一个字符不是右括号,就匹配所有后面的单词字符 - 现在这可能也是不必要的,所以让我们尝试删除前瞻\b
- 并匹配单词边界2(?:^|\s)([\w']+)(?!\])\b
如果您找不到选项 1 - 只进行单词匹配,而无需寻找方括号,因为我们在第一部分确保它们不在这里。
好的,所以我删除了所有我们不需要的东西(他们留在那里,因为我在它起作用之前尝试了很多选项:-),修改后的正则表达式如下:
\[[^\]]+\]\s([\w']+)(?!\])\b|(?:^|\s)([\w']+)\b
我会使用类似\[[^\]]*\]
删除方括号之间的单词,然后按空格分解返回的字符串来计算剩余的单词。
克里斯,重新提出这个问题,因为它有一个没有提到的简单解决方案。(在对有关如何在 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>
参考