4

我正在使用以下正则表达式来匹配所有单词:

mystr.replace(/([^\W_]+[^\s-]*) */g, function (match, p1, index, title) {...}

请注意,单词可以包含特殊字符,例如德语变音符号。如何匹配除括号内的单词之外的所有单词?

如果我有以下字符串:

here wäre c'è (don't match this one) match this

我想得到以下输出:

here
wäre
c'è
match
this

尾随空格并不重要。有没有一种简单的方法可以在 javascript 中使用正则表达式来实现这一点?

编辑:我不能删除括号中的文本,因为最终的字符串“mystr”也应该包含这个文本,而字符串操作将在匹配的文本上执行。“mystr”中包含的最终字符串可能如下所示:

Here Wäre C'è (don't match this one) Match This
4

2 回答 2

4

尝试这个:

var str = "here wäre c'è (don't match this one) match this";

str.replace(/\([^\)]*\)/g, '')  // remove text inside parens (& parens)
   .match(/(\S+)/g);            // match remaining text

// ["here", "wäre", "c'è", "match", "this"]
于 2012-10-15T11:47:46.763 回答
2

托马斯,复活了这个问题,因为它有一个没有提到的简单解决方案,并且不需要替换然后匹配(一步而不是两步)。(在对有关如何在 regex 中排除模式的一般问题进行一些研究时发现了您的问题。)

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

\(.*?\)|([^\W_]+[^\s-]*)

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

该程序展示了如何使用正则表达式(参见在线演示中的匹配项):

<script>
var subject = 'here wäre c\'è (don\'t match this one) match this';
var regex = /\(.*?\)|([^\W_]+[^\s-]*)/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>*** Matches ***<br>");
if (group1Caps.length > 0) {
   for (key in group1Caps) document.write(group1Caps[key],"<br>");
   }

</script>

参考

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

于 2014-05-21T06:58:39.093 回答