【问题标题】:Regex to match all words except those in parentheses - javascript正则表达式匹配除括号中的所有单词 - javascript
【发布时间】:2012-10-05 09:05:49
【问题描述】:

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

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

【问题讨论】:

  • 我认为使用单个正则表达式是不可能的,可能你需要先用它们的内容去掉括号。
  • 您是否需要考虑嵌套的(像这样(甚至是这样))括号?如果是这样,您将不得不对嵌套施加上限或转到非基于 RE 的解决方案。
  • 无需考虑嵌套括号。可以有多个 parentese,但它们不会嵌套。例如“(喜欢这个)和喜欢(这个)”
  • 我接受 Fabrizio 的回答,因为它在使我的问题更具体之前是正确的。为了解决我的问题,我将在回调函数中搜索打开和关闭括号。这不如正则表达式好,但效果很好。

标签: javascript regex


【解决方案1】:

试试这个:

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

【讨论】:

  • 顺便说一句,括号在字符类中没有意义,因此它们不需要转义 - [^)] 非常好。任何其他元字符也是如此。
  • 是的,确实如此。我只是将特殊字符作为个人习惯逃避,即使没有必要。
  • 感谢 Fabrizio,但我的问题不够具体。我无法删除括号中的字符串,因为应该返回包括括号中的文本在内的整个字符串,同时将对匹配项执行字符串操作。
  • 将修改后的副本与原始副本结合起来会遇到问题,因为最终输出包含修改后的匹配项和括号中被忽略的文本。
【解决方案2】:

Thomas,重新提出这个问题,因为它有一个未提及的简单解决方案,并且不需要替换然后匹配(一步而不是两步)。 (在对有关how to exclude patterns in regex 的一般问题进行一些研究时发现了您的问题。)

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

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

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

这个程序展示了如何使用正则表达式(参见online demo 中的匹配项):

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

参考

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

【讨论】:

猜你喜欢
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2015-04-20
  • 2010-09-22
相关资源
最近更新 更多