You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:20:05