Scala正则表达式匹配大括号内容问题及特定匹配需求求助
解决类WML语言的正则token匹配问题
嘿,搞类WML模板解析呢?正则匹配这块卡壳太正常了,我帮你拆解下问题~
一、先搞定匹配第1、2、5、6个token的问题
我猜你大概率踩了正则特殊字符转义的坑!{和}在正则里是量词标记(比如{2,3}表示匹配2-3次),所以要匹配字面量的{{,必须对它们转义,写成\{\{(或者\{{2}},效果一致),同理}}要写成\}\}。如果直接写{{,正则引擎会把它当成语法错误或者无法正确识别,这就是你测试代码无输出的核心原因!
正确的正则表达式
如果你的token是{{xxx}}格式(xxx由字母、数字、下划线或连字符组成),用这个正则就能精准匹配所有符合格式的token:
\{\{[\w-]+\}\}
\{\{:匹配字面量的两个左大括号[\w-]+:匹配一个或多个合法的token字符(如果需要支持其他字符,比如点号,改成[\w\-.]+即可)\}\}:匹配字面量的两个右大括号
示例代码(以Python为例)
import re # 假设你的测试文本是这样的 test_text = """{{user_name}} {{user_age}} plain_text [bad_token] {{order_id}} {{order_date}}""" pattern = r"\{\{[\w-]+\}\}" matches = re.findall(pattern, test_text) print(matches) # 输出:['{{user_name}}', '{{user_age}}', '{{order_id}}', '{{order_date}}']
这样就能匹配到你说的第1、2、5、6个token了。
二、如何仅匹配第1和第5个token?
这里分两种情况:
情况1:第1、5个token有特定模式
如果这两个token的名称有共同特征(比如第一个是{{user_*}},第五个是{{order_id}}),可以写组合正则直接匹配:
\{\{(user_.+|order_id)\}\}
这样就能精准命中符合这两种模式的token。
情况2:仅按出现顺序匹配第1和第5个
正则本身是基于模式匹配的工具,没法直接按位置计数匹配。这种情况要先找出所有符合格式的token,再通过代码提取对应位置的结果:
matches = re.findall(pattern, test_text) # 取第1个(索引0)和第5个(索引4,因为列表是0开始计数) target_tokens = [matches[0], matches[4]] print(target_tokens) # 输出:['{{user_name}}', '{{order_id}}']
内容的提问来源于stack exchange,提问作者Donat
相关产品推荐
相关产品推荐

