匹配不以省略号结尾的字符串中的单词

时间:2011-06-19 07:24:42

标签: javascript regex pattern-matching

假设我有以下字符串:

ZD:123123 ZD:213123 ZD:2e213 [ZD:213123] [ZD#221313] ZD:234...

我希望模式匹配每次出现除了 ZD:234...,因为我不想要任何有缺席的单词。

这种模式在JavaScript中很适合我:

/(\[|\(|)ZD[:#]\w+(\]|\)|)/g

但是,它仍会捕获ZD:234 ZD:234...部分,我绝对不希望这样做。

如何阻止正则表达式执行此操作?

2 个答案:

答案 0 :(得分:5)

一个简单的解决方法是使用否定前瞻:

/(\[|\(|)ZD[:#]\w+\b(\]|\)|)(?!\.\.\.)/g 

请注意,我还添加了\b以避免在ZD:23上匹配。

有点简化:

/[\[(]?ZD[:#]\w+\b[\])]?(?!\.\.\.)/g

如果您需要匹配的括号(无[ZD:123)):

/(?:ZD[:#]\w+|\[ZD[:#]\w+\]|\(ZD[:#]\w+\))\b(?!\.\.\.)/g

答案 1 :(得分:0)

给猫皮肤涂抹的方法不止一种。通过使用更简单的正则表达式,以下内容将适用于更多浏览器:

function trim(s) {
  return s.replace(/^ | $/g,'').replace(/\s+/g,' ');
}

var x = 'ZD:123123 ZD:213123 ZD:2e213... [ZD:213123] [ZD#221313] ZD:234...';
alert(
  trim(x.replace(/(^| )[^ ]+[\.]{3}( |$)/g,' ')).split(/\s+/)
);

/* shows: ZD:123123,ZD:213123,[ZD:213123],[ZD#221313] */

它删除以...结尾的字符的任何空格分隔的“单词”,然后在空格上分割。