`
khotyn
  • 浏览: 42337 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用零宽断言来匹配不包含连续字符串的行

阅读更多

     最近在工作中遇到一个问题,有N个字符串,需要用正则表达式去过滤掉不包含某一个特定连续字符串(比如abc)的字符串。

 

     在网上搜罗了一大把,找到了在Perl 5的正则表达式中有零宽断言这个东西,非常强大,先来了解下零宽断言倒是是什么?

 

     简单的说,零宽断言是查找在某些内容之前或者之后的东西,这样解释起来可能比较抽象,我们来具体看下几种零宽断言:

  • (?=exp):这个零宽断言用来断言自身出现的位置之后能够匹配到表达式exp,考虑下面这一个正则表达式q(?=u),这个正则表达式表示匹配后面的字符是u的q
  • (?!exp):这个零宽断言用来断言自身出现的位置之后不能够匹配到表达式exp,看下面这一个正则表达式q(?!u),这个正则表达式表示匹配后面的字符不是u的q
  • (?<=exp):这个零宽断言用来断言自身出现的位置之前能够匹配到表达式exp
  • (?<!exp):这个零宽断言用来断言自身出现的位置之前不能够匹配到表达式exp

     在理解零宽断言的时候需要注意的一点是它是一种断言,也就是说零宽断言只会告诉你匹不匹配,但是不会“消费”掉字符串内的内容,我用下面的这一个例子来解释这个情况:

 

     我们有一个正则表达式k(?=h)otyn,用它去匹配khotyn,乍看一下这个匹配是会成功的,但是由于零宽断言只做断言,而不会"消费"掉匹配到的字符串,所以事实上,这个正则表达式匹配是一个后面是h的k,并且这个k的后面是otyn,这样这个正则表达式无论什么字符串都会匹配失败(正确的应该是k(?=h)hotyn,不过这样加不加零宽断言并没有意义)。

 

     在理解零宽断言以后,我们来看一下如何来匹配出不包含“abc”的字符串,下面是我写出的结果:

((?!abc).)+

     首先我们看这个正则表达式里面的“(?!abc).”部分,这个部分断言一个空字符后面不能够匹配到字符串abc,并且这个空字符串后面是一个任意字符。

 

     我们来看下下面这一段代码:

Pattern pattern = new Perl5Compiler().compile("((?!abc).)+");
Perl5Matcher matcher = new Perl5Matcher();
System.out.println(matcher.matches("abc", pattern));
System.out.println(matcher.matches("abdas dfas", pattern));

     这段代码的执行结果是:

false
true

     第一个匹配失败是因为在字符'a'前面的空字符后面匹配到了字符串"abc",因此断言失败,从而匹配失败。

 

     第二个匹配成功是因为没有任何一个空字符后面有出现"abc",因为匹配成功。

 

     最后加上+号的原因是因为能够做到完全匹配,因为任何一个字符只要其本身不是‘a’,并且后面不是‘bc’,那么就是能够匹配"(?!abc)."的,因此,只要一个字符串里面不包含abc,那么它就能够完全匹配((?abc).)+

分享到:
评论

相关推荐

    正则表达式。包括零宽断言,正则替换的150种表达方式

    #### 例9:匹配包含等于号的行 ``` .*=.* ``` 这个表达式用于查找任何包含“=”的行。 #### 例10:匹配以指定字符结尾的行 ``` .*$character ``` 你可以将“character”替换为你想要的任何字符。 ### 五、实战应用...

    C#实现移除字符串末尾指定字符的方法

    如果找到了这个字符,就使用`Substring`方法截取字符串的前部分,不包括指定字符;如果没有找到,就直接返回原始字符串。 ```csharp public static string RemoveLastChar(this string str, string value) { int _...

    正则表达式之零宽断言实例详解【基于PHP】

    在实际应用中,零宽断言可以用来精确控制匹配的条件,避免匹配不需要的字符串。例如: - 例1:`\d+(?=abc)` 会匹配所有在 "abc" 之前的一串数字。 - 例2:`(?)\w` 会匹配所有紧跟在连续两个数字后面的字母。 - 例3...

    解析字符串

    4. **零宽断言**:这是正则表达式中的高级特性,不消耗字符,用于判断当前位置是否满足某种条件。比如`(?=pattern)`是正向前瞻断言,表示当前位置后面必须跟着`pattern`;`(?!pattern)`是负向前瞻断言,表示当前位置...

    C#验证密码不能含有键盘连续字母

    (.)\1{2})`是一个否定前瞻断言,确保当前字符与接下来的两个字符不相同,`[a-zA-Z0-9]*`匹配任何字母或数字,`$`表示字符串的结束。如果密码不匹配这个模式,那么`IsMatch`方法将返回`false`,表明密码不符合要求。 ...

    正则表达式检查16进制字符串共1页.pdf.zip

    在给定的标题"正则表达式检查16进制字符串共1页.pdf.zip"和描述中,我们可以推断出这份文档可能涉及的是如何使用正则表达式来验证或操作16进制(Hexadecimal)字符串。16进制字符串是由0到9和A到F(或者a到f)的字符...

    正则表达式:运算符优先级介绍

    零宽断言不消耗字符,即匹配后不会移动字符串的位置。例如,`^`代表行的开头,`$`代表行的结尾。非零宽断言分为先行断言(lookahead)和后发断言(lookbehind)。例如,`(?)`表示后发断言,它会匹配紧跟在“abc”...

    正则表达式的基础教程

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和提取字符串中的特定模式。在编程、数据处理和文本编辑器中广泛使用。本文将深入介绍正则表达式的基础知识,帮助你掌握这一强大的技术。 2. 如何使用本...

    js Abba逆向前瞻正则匹配实例

    在本实例中,我们来详细解读如何在JavaScript中使用零宽负向前瞻断言进行匹配,以及如何应用这一技术进行实际的字符串匹配测试。 实例的核心代码如下所示: ```javascript var s1 = 'acritan'; var s2 = '...

    易语言源码易语言“正则表达式”教程.rar

    在易语言中,你可以使用`创建正则表达式对象`函数创建一个正则表达式对象,然后通过`匹配字符串`、`全局匹配字符串`和`替换字符串`等方法进行操作。例如,你可以用`匹配字符串`来检测一个字符串是否符合特定模式,...

    JS去除空格和换行的正则表达式(推荐).docx

    如果只想去除字符串开头的空格,可以使用正向先行断言 `^` 来匹配字符串的开始位置,配合 `\s*` 匹配零个或多个空格: ```javascript function LTrim(str) { return str.replace(/^\s*/g,""); } ``` 4. 去除右侧...

    正则表达式

    10. **零宽断言**:零宽断言如 lookahead `(?=...)` 和 lookbehind `(?)` 用于检查某个位置是否满足条件,但不包括该位置的字符。 通过熟练掌握这些基础和进阶规则,你可以构建出复杂的正则表达式来处理各种字符串...

    Javascript正则表达式测试网页.rar

    正则表达式(Regular Expression)是一种模式匹配语言,它使用特殊的字符序列来描述字符串的模式。在JavaScript中,正则表达式常用于字符串方法如`match()`、`search()`、`replace()`和`split()`中。以下是一些关键...

    C#正则表达式(包括数字、汉字和英文的等等)

    在编程领域,正则表达式是一种强大的文本处理工具,它能用来进行字符串的匹配、查找、替换和提取等操作。在C#中,正则表达式是通过`System.Text.RegularExpressions`命名空间中的类来实现的。本文将深入探讨C#中的...

    Python 正则表达式匹配数字及字符串中的纯数字

    在本内容中,我们将详细探讨如何使用Python正则表达式匹配数字以及如何从字符串中找出纯数字。 首先,了解正则表达式的概念对于掌握其匹配数字的应用至关重要。正则表达式由一系列字符构成,这些字符定义了一种搜索...

    正则表达式快速入门(案例讲解)

    零宽断言不会消耗输入字符串中的字符,但会检查某个位置是否满足某种条件。 - **正向零宽断言**:`(?=...)`表示其后的正则表达式必须匹配。 - **示例**:`a(?=b)`表示匹配"a",但"a"后面必须是"b"。 ##### 5. 负向...

    正则匹配代码\正则匹配代码

    =...)` 正向前瞻断言,匹配当前位置后面满足某种条件的文本,但不包含这部分文本。 - `(?!...)` 正向后顾断言,匹配当前位置后面不满足某种条件的文本。 9. **反向引用** 在括号内创建的分组可以通过 \1、\2 等...

Global site tag (gtag.js) - Google Analytics