You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

正则表达式无法匹配跨行大括号内容,如何修改?

正则表达式匹配大括号内包含换行文本的解决方案

问题描述

我想要提取大括号之间的文本。示例文本:(a) 关于交割时应付卖方的购买价款以外的款项,买方出具的金额不超过$ {Uncertified Check Limit} 的未认证支票;以及(b) {All obligations affecting the Premises pursuant to the Administrative Code of the City of New York incurred prior to Closing and payable in money shall be discharged by Seller at or prior to Closing.} 卖方陈述。我希望从该文本中提取:{Uncertified Check Limit} {All obligations affecting the Premises pursuant to the Administrative Code of the City of New York incurred prior to Closing and payable in money shall be discharged by Seller at or prior to Closing.}
我当前使用的正则表达式{(.*?)}无法匹配换行,请问应如何修改?

解决方法

别担心,这个问题太常见了!你用的{(.*?)}里的.默认规则是不匹配换行符,所以一旦大括号里的内容包含换行,匹配就会中断。这里给你两种靠谱的修改方案:

  • 方案一:启用DOTALL/s修饰符
    多数正则引擎都支持s(也叫DOTALL)修饰符,它能让.匹配包括换行在内的所有字符。修改后的正则本身不变,但要加上对应修饰符:

    {(.*?)}
    

    举个实际使用的例子:

    • 在Python里:re.findall(r'{(.*?)}', 你的文本变量, re.DOTALL)
    • 在JavaScript里:文本变量.match(/{(.*?)}/gs)
  • 方案二:手动覆盖所有字符(兼容所有引擎)
    如果你的正则环境不支持s修饰符,那就用[\s\S]或者[\d\D]代替.——这两个组合能匹配所有空白、非空白字符(说白了就是所有字符,包括换行)。修改后的正则是:

    {([\s\S]*?)}
    

    这个写法几乎在所有正则场景下都能生效,不用依赖任何修饰符,兼容性拉满。

小提醒

如果你的文本里存在嵌套大括号(比如{a{b}c}),上面的非贪婪匹配会在第一个}就停止,导致匹配结果不完整。不过看你的示例文本没有这种情况,所以这两种方案完全够用啦~

内容的提问来源于stack exchange,提问作者Sergey Dudik

火山引擎 最新活动