正则表达式问题:如何校验Teacher后首个Name对应指定内容?
正则匹配问题:校验Teacher后第一个Name字段值为ABC
需求场景
需要校验字符串中,Teacher之后出现的第一个Name:对应的内容必须是ABC。
示例目标匹配字符串:
Teacher: ID: 123 Something: Something Name: ABC Age: 40 Student1: Name: XYZ Age: 12 Student2: Name: ABC
问题:原有正则误判
尝试使用惰性匹配正则:
/(Teacher:(.*?)Name: ABC)/
但该正则会在如下场景误判为匹配成功:
Teacher: Name: EFG Age: 40 Student1: Name: XYZ Age: 12 Student2: Name: ABC
原因是惰性匹配仅保证匹配到最短的符合结尾的字符串,但允许中间出现其他Name:字段,导致它会跳过前面的Name: EFG,匹配到最后面的Name: ABC,不符合“第一个Name字段为ABC”的要求。
解决方案:使用负向前瞻避免中间出现Name字段
正确的正则应该限制Teacher到第一个Name:之间不能出现其他Name:字段,使用负向前瞻实现:
/(Teacher:(?:(?!Name:).)*Name: ABC)/
正则说明
(?:(?!Name:).)*:非捕获组,匹配任意数量的字符,但每一个字符的后续都不是Name:的开头,确保中间不会出现其他Name:字段- 这样就能精准匹配Teacher之后第一个出现的
Name:值为ABC的情况,避免误判。
内容的提问来源于stack exchange,提问作者killsteenkill
相关产品推荐
相关产品推荐

