【问题标题】:Regex to not match a pattern in string正则表达式不匹配字符串中的模式
【发布时间】:2015-11-08 00:59:19
【问题描述】:

我是一个新手,在过去的一个小时里一直在努力解决这个问题。假设您有这些字符串:

baa cec haw heef baas bat jackaay

我想连续匹配所有没有两个aa的单词,所以在上面它将匹配cechawheefbat

这是我到目前为止所做的,但我能感觉到这是完全错误的:D

\w*[^\s]*[^a\s]{2}[^\s]*\w*

【问题讨论】:

  • 那么是 Javascript 还是 Python 还是 Perl?
  • Python:[s for s in myStrings if 'aa' not in s]
  • @mshsayem [s for s in myStrings.split() if 'aa' not in s]
  • @Kevin Guan:在您发表评论前一秒改变了,:p。他说,strings 我解释为一个集合/列表
  • 一般是正则表达式,使用regex101.com进行测试

标签: regex


【解决方案1】:

您需要一个包含两件事的正则表达式:单词边界\b 和紧随其后的否定前瞻(它将以这种方式锚定),这将对随后的子模式施加限制。

\b(?!\w*aa)\w+

the regex demo

正则表达式分解:

  • \b - 字边界
  • (?!\w*aa) - 如果单词有 0 个或多个单词字符后跟两个 as,则否定前瞻将取消匹配
  • \w+ - 1 个或多个单词字符。

代码演示:

var re = /\b(?!\w*aa)\w+/gi; 
var str = 'baa cec haw heef bAas bat jackaay bar ha aa lar';
var res = str.match(re);
document.write(JSON.stringify(res));

【讨论】:

  • 非常感谢。我会努力理解它是如何工作的,但它确实有效并且正是我想要实现的目标。
  • 请参阅Word BoundariesLookahead and Lookbehind Zero-Length Assertions 文章。主要模式是\w(字母数字+下划线匹配子模式),我们匹配1次或多次(+),只有在非单词字符(不是[a-zA-Z0-9_])之后,如果它没有aa(因为我们如果在零个或多个单词字符之后有aa,则先用前瞻检查单词(\w*)。
【解决方案2】:

您可能想要使用负前瞻:

/(^|\s)(?!\w*aa\w*)(\w+)/gi

您可以通过将此代码粘贴到 Chrome/Firefox (F12) 的控制台上来检查您的字符串:

var pattern = /(^|\s)(?!\w*aa\w*)(\w+)/gi;
var str = 'baa cec haw heef baas bat jackaay';
while(match = pattern.exec(str))
    console.log(match[2]); // position 2 is (\w+) in regex

您可以阅读有关前瞻here 的更多信息。 请参阅 Regex101 上的 it 以了解此正则表达式的工作原理。

【讨论】:

  • 谢谢。这几乎可以工作。它只是捕获单词之间的空格以及组的一部分。
  • 如果您选择第二组,您将获得预期的字符串。但我认为@stribizhev 有更好的解决方案。
【解决方案3】:

在 javascript 中,您可以使用 filter 和正则表达式反转 ! 非捕获组 ?:

var strings = ['baa','cec','haw','heef','baas','bat','jackaay'];
strings = $(strings).filter(function(index, element){
   return !/.*(?:aa).*/.test(element);                // regex => .*(?:aa).*
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    相关资源
    最近更新 更多