0

0

使用正则表达式精确提取双大括号内文本并去除首尾空格

碧海醫心

碧海醫心

发布时间:2025-11-18 14:25:10

|

861人浏览过

|

来源于php中文网

原创

使用正则表达式精确提取双大括号内文本并去除首尾空格

本文详细讲解如何使用正则表达式从双大括号`{{...}}`中提取目标文本,同时自动去除文本内容前后的多余空格。通过引入正向肯定查找和负向肯定查找等高级特性,确保匹配结果的精确性,避免捕获到不必要的空白字符,并提供性能优化的考量。

在日常的文本处理和模板解析中,我们经常需要从特定分隔符(例如双大括号 {{...}})中提取内部内容。然而,一个常见的问题是,这些内容可能包含不必要的首尾空格,导致提取结果不纯净。例如,对于 {{ test }}, {{test}}, {{ test}}, {{test }} 这类字符串,我们期望的提取结果都是 test,而不是包含空格的版本。

挑战:简单匹配的局限性

初学者可能会尝试使用类似 /(?

然而,这种方法会捕获所有位于 {{ 和 }} 之间的字符,包括多余的首尾空格。因此,对于 {{ test }},它会匹配到 test(包含前后空格),这并非我们所期望的纯净结果。

解决方案:结合断言精确控制匹配边界

为了解决这个问题,我们需要在断言中进一步细化对空格的控制。核心思想是:在匹配开始时,允许 {{ 后跟任意空格,但实际匹配的内容必须以非空格字符开始;在匹配结束时,允许内容后跟任意空格,但实际匹配的内容必须在 }} 之前结束。

以下是实现这一目标的推荐正则表达式:

(?<={{\s*)(?=\S).*?(?=\s*}})

让我们详细解析这个正则表达式的每个部分:

  1. (?正向肯定后行断言。

    • {{:匹配字面量 {{。
    • \s*:匹配零个或多个空白字符(包括空格、制表符、换行符等)。
    • 整个部分的作用是:确保当前匹配位置之前必须是 {{ 后跟零个或多个空格。重要的是,它不会将 {{ 或其后的空格包含在最终的匹配结果中,只是用来设定匹配的起始条件。
  2. (?=\S):这是一个正向肯定先行断言

    • \S:匹配任何非空白字符。
    • 这个部分的作用是:确保当前匹配位置之后必须紧跟着一个非空白字符。这意味着,如果 {{ 后面有空格,\s* 会跳过它们,然后 (?=\S) 会检查下一个字符是否是非空白字符,从而有效地“跳过”所有前导空格,确保实际匹配从第一个非空白字符开始。
  3. .*?:这是实际匹配内容的非贪婪模式

    • .:匹配除换行符之外的任何字符。
    • *:匹配前一个字符零次或多次。
    • ?:使 * 变为非贪婪模式,即尽可能少地匹配字符。
    • 它会从 (?=\S) 确定的位置开始,尽可能少地匹配任意字符,直到遇到下一个断言的条件。
  4. (?=\s*}}):这是一个正向肯定先行断言

    天工大模型
    天工大模型

    中国首个对标ChatGPT的双千亿级大语言模型

    下载
    • \s*:匹配零个或多个空白字符。
    • }}:匹配字面量 }}。
    • 整个部分的作用是:确保当前匹配位置之后必须是零个或多个空格后跟 }}。与后行断言类似,它不会将这些空格或 }} 包含在最终的匹配结果中,只是用来设定匹配的结束条件。这有效地“跳过”了所有尾随空格,确保实际匹配在最后一个非空白字符处结束。

实际应用示例

使用上述正则表达式 (?

  • {{ test }} -> 匹配结果:test
  • {{test}} -> 匹配结果:test
  • {{ test}} -> 匹配结果:test
  • {{test }} -> 匹配结果:test

所有示例都将精确地提取出 test,完美地去除了首尾空格。

您可以在 regex101 上查看此正则表达式的在线演示。

性能优化考量

如果能够保证双大括号内至少包含一个非空白字符(即不会出现 {{ }} 这样的情况),那么可以进一步优化正则表达式以提高性能:

(?<={{\s*)\S.*?(?=\s*}})

这个优化版本移除了 (?=\S) 这个先行断言,而是直接用 \S 开始匹配。

  • (?
  • \S:直接匹配第一个非空白字符。这比 (?=\S) 更直接,因为它直接消耗了一个字符,而不是仅仅进行检查。
  • .*?:继续非贪婪匹配剩余字符。
  • (?=\s*}}):保持不变,确保匹配后有任意空格和 }}。

这种优化在某些正则引擎中可能会带来轻微的性能提升,因为它减少了一次断言检查,直接从第一个非空白字符开始捕获。

总结与最佳实践

在需要从特定分隔符中提取内容并去除首尾空格时,使用结合了正向肯定后行断言和先行断言的正则表达式是一种强大而精确的方法。

  • 利用 (? 来定义匹配的边界,同时允许边界内部的空格不被捕获。
  • 结合 (?=\S) 或直接使用 \S 来确保匹配内容的起始是非空白字符,从而剔除前导空格。
  • *使用 `.?` 进行非贪婪匹配**,以避免匹配到不属于当前目标的多余内容。

掌握这些技巧,将使您在处理复杂文本匹配场景时更加得心应手。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

247

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

732

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

211

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

349

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

231

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

527

2023.12.06

java 元空间 永久代
java 元空间 永久代

本专题整合了java中元空间和永久代的区别,阅读专题下面的文章了解更多详细内容。

1

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
AngularJS教程
AngularJS教程

共24课时 | 2.4万人学习

【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.4万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号