不管是零宽仍是断言。听起来都是古古怪怪的,先解释下这两个名词。正则表达式
假如咱们要爬虫抓取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表达式的后面内容,不返回自己