如何用RegEx捕获含换行符至首个指定字符的字符串并提取源串首个实例?
正则捕获含换行的字符串直至首个指定字符集合
嘿,我来帮你搞定这个正则捕获的问题!
核心思路先理清楚
正则默认的.元字符是不匹配换行符(\n)的,所以要捕获包含换行的内容,必须启用DOTALL(单行)模式,让.能覆盖所有字符(包括换行)。另外,一定要用非贪婪量词(*?或+?),这样才能保证匹配到首个出现的指定终止字符集合就停,不会一路匹配到最后一个终止符。
通用正则模板
假设你要找的终止字符集合是XYZ(可以是单个字符、一串字符或者字符组),通用的正则结构是这样的:
(.*?)XYZ
记得配合DOTALL模式使用,不同语言里开启方式不一样:
- Python:加
re.DOTALL参数,比如re.findall(r'(.*?)XYZ', 你的字符串, re.DOTALL) - JavaScript:在正则后面加
s标志,比如你的字符串.match(/(.*?)XYZ/s) - Java:用
Pattern.DOTALL常量,比如Pattern.compile("(.*?)XYZ", Pattern.DOTALL)
针对你给的源字符串实例
先看你的源字符串开头:
<body xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"...
场景1:捕获<text到首个>之间的内容(含换行)
如果你的需求是抓<text标签的属性部分,直到第一个闭合的>,正则可以这么写(记得开DOTALL模式):
<text(.*?)>
捕获结果
抓出来的内容就是:
color="#FFFF00" creationdate="D:20180307100631+04'00'" flags="print,nozoom,norotate" date="D:20180307100652+04'00'" name="a60915a3-1c23-4f6d-b8d4-fbe0dd4890e9" icon="Comment" page="7" rect="351.308000,135.732000,371.308000,153.732000" subject="Sticky Note" title="saddia"
场景2:捕获到<contents-richtext为止
如果你的终止字符集合是<contents-richtext,那正则调整成这样就行:
<text(.*?)<contents-richtext
同样开DOTALL模式,就能抓到<text开头到第一个<contents-richtext之间的所有内容(哪怕中间有换行也能覆盖)。
几个要注意的坑
- 别用贪婪量词:如果把
*?写成*,正则会一路匹配到最后一个终止符,完全不符合你要“首个”的需求。 - 一定要开DOTALL模式:不然换行符会被
.忽略,遇到换行就直接停了,抓不到完整内容。 - 终止符有特殊字符要转义:如果你的终止字符集合里有
+、*、(这类正则元字符,记得用\转义,比如终止符是+04'00',要写成\+04'00'。
内容的提问来源于stack exchange,提问作者shrivallabha.redij
相关产品推荐
相关产品推荐

