正则表达式

出于工作的需要(业余采集某信公众号), 需要将某信的类似扩展阅读拿掉

在采集其余的内容的时候我一般采取的是使用 xPath 的方式进行抽取数据.

尝试之后发现不同的公众号之间存在相互冲突的地方, 故而此法不通

看过代码之后, 设计的初衷一共有 3 中方式进行抽取: xPath, CSS, Regex

CSS 也不行, 因为样式一共也没几种...

暂定按照对应的 Regex 去除: Regex 尽量详细, 这样才能保证当前的公众号不会影响到其余的公众号的信息数据.

经过一番尝试之后终于成功了!!!

如下主要记录我在抽取数据的过程中用到的主要的正则表达式:

  1 .* 匹配当前行的任意字符, 除了换行符 \n

  2 ([\s\S]*) 匹配空白字符, 匹配非空白字符, 二者的并集即匹配任意字符
    今天在Java中想使用正则表达式来获取一段文本中的任意字符。于是很随意得就写出如下匹配规则: (.*)

    结果运行之后才发现,无法获得换行之后的文本。

    于是查了一下手册,才发现正则表达式中,“.”(点符号)匹配的是除了换行符“\n”以外的所有字符。
    同时,手册上还有一句话:要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。于是我将正则表达式的匹配规则修改如下:
    ([.\n]*),当然,如果是在java程序中直接写到话,需要改为([.\\n]*)
    结果再次运行程序,发现什么内容也取不到了。我百思不得其解,又将其修改为如下规则:
    ([.|\n]*) 以及 ([\n.]*)
    结果还是不行,什么内容都取不到。看来点符号和换行符卯上劲了~

    然后上网一查,虽然没有查出上述规则到底是什么地方出问题了,但是查出了一个解决办法,经过一试,果然可以匹配包括换行符在内的任意字符,以下为 正确的正则表达式匹配规则: ([\s\S]*)
同时,也可以用 “([\d\D]*)”、“([\w\W]*)” 来表示。


在文本文件里, 这个表达式可以匹配所有的英文
/[ -~]/
这个表达式可以匹配所有的非英文(比如中文)
/[^ -~]/
/是VI里用的. 你在editplus或程序里不需要/

3 (abc)? 匹配 abc 一次或零次, 相当于(abc){0,1} (abc)+ 匹配 abc 一次或多次 (abc) 匹配 abc 一次

4 java 默认的是贪婪匹配, 即从第一次出现到当前的目标位置,
例如 .* 表示匹配当前行到目标位置的所有内容
而 .*? 则表示是非贪婪匹配, 当前行到目标位置的最近内容

5. (?=abc) 匹配 abc 之前的内容不匹配 abc, 零宽度正预测先行断言;
(?<=abc) 匹配 abc 之后的内容不匹配 abc, 零宽度正回顾后发断言

PS: 第一次写, 万望轻喷

PPS: 很多地方写的不全, 见笑

 

posted @ 2018-06-01 15:36  水能载舟亦能载艇  阅读(117)  评论(0编辑  收藏  举报