我正在尝试返回方括号之间的所有单词的计数。所以给了..
[don't match these words] but do match these
我在最后四个单词中得到4分。
这适用于.net:
\b(?<!\[)[\w']+(?!\])\b
但它在Javascript中不起作用,因为它不支持lookbehind
纯js正则表达式解决方案的任何想法?
答案 0 :(得分:5)
好的,我认为这应该有效:
\[[^\]]+\](?:^|\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
答案 1 :(得分:1)
我会使用\[[^\]]*\]
之类的内容删除方括号之间的单词,然后使用空格来爆炸返回的字符串以计算剩余的单词。
答案 2 :(得分:0)
这是我们的简单正则表达式(在工作中查看它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...