零宽断言

不管是零宽仍是断言。听起来都是古古怪怪的,先解释下这两个名词。正则表达式

 

  • 零宽:就是没有宽度,在正则中,断言只是匹配位置,不占字符,也就是说,匹配结果是不会返回断言自己的。
  • 断言:就是“我判定什么”,在正则中能够指明在指定内容的前面或者后面会出现指定规则的内容。

假如咱们要爬虫抓取CSDN里文章的阅读数量。经过查看源代码能够看到这样的结构。spa

"<span class="read-count">阅读数:641</span>"code

也就是641这个数字,那用正则怎么获取这个数字呢,正则应该怎么匹配呢?blog

  • 正向先行断言

语法:(?=pattern)字符串

做用:匹配pattern表达式前面内容,不返回自己class

好吧,回归那个列子,要取到阅读量,在正则表达式中就意味着要匹配到</span>前面的数字内容,那么能够这样写 (?=</span>) 就能够匹配到前面的内容了。语法

String regex = ".+(?=</span>)";
    String text = "<span class=\"read-count\">阅读数:641</span>";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("匹配所有结果:" + matcher.group());
    }
    // 匹配所有结果:<span class="read-count">阅读数:641

 

String regex = "\\d+(?=</span>)";
    String text = "<span class=\"read-count\">阅读数:641</span>";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("匹配数字:" + matcher.group());
    }
    // 匹配数字:641

  •  正向后行断言

语法:(?<=pattern)di

做用:匹配pattern表达式后面的内容,不返回自己while

正向先行是匹配前面的内容,那么正向后行就是匹配后面的内容了。上面的例子能够用正向后行处理。co

String regex = "(?<=<span class=\\\"read-count\\\">阅读数:)\\d+";
    String text = "<span class=\"read-count\">阅读数:641</span>";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("匹配数字:" + matcher.group());
    }
    // 匹配数字:641
  • 负向先行断言

语法:(?!pattern)

做用:匹配非表达式前面的内容,不返回自己

有正向就有负向,这里的负向是非的意思。

举个例子:好比有一句话"我爱祖国,我是祖国的花朵",如今要找到不是“的花朵”前面的祖国,如今能够这样写   "祖国(?!的花朵)"

 

String regex = "祖国(?!的花朵)";
    String text = "我爱祖国,我是祖国的花朵";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("匹配字符串:" + matcher.group());
    }
    // 匹配字符串:祖国
  • 负向后行断言

语法:(?<!pattern)

做用:匹配非pattern表达式的后面内容,不返回自己

相关文章
相关标签/搜索