如何编写适配分组缺失场景的动态正则表达式?
固定句式的多分组提取正则解决方案
推荐使用以下正则表达式,可适配分组缺失或为空的场景:
^(.*?) is eating a (.*?)(?: by (.*?)(?: at (.*))?)?$
正则拆解
^:锚定字符串开头,确保匹配从起始位置开始(.*?):第一个捕获组,提取[name],非贪婪匹配到is eating a之前的内容is eating a:匹配固定句式的中间标识(.*?):第二个捕获组,提取[item],非贪婪匹配到by之前(若存在),否则匹配对应空内容(?: by (.*?)(?: at (.*))?)?:非捕获可选块,包裹by和at相关内容,末尾?表示整个块可缺失:by:匹配固定前缀by(.*?):第三个捕获组,提取[by name],非贪婪匹配到at之前(若存在),否则匹配到字符串结尾(?: at (.*))?:嵌套非捕获可选块,包裹at相关内容:at:匹配固定前缀at(.*):第四个捕获组,提取[at name],匹配at之后的所有内容
示例验证
针对你提供的3条字符串,捕获结果如下:
- 输入:
Rafael C. is eating a Burger by McDonalds at Beach
捕获分组:["Rafael C.", "Burger", "McDonalds", "Beach"] - 输入:
David K. is eating a Burger by McDonalds
捕获分组:["David K.", "Burger", "McDonalds", ""](注:部分正则引擎未匹配到的分组会返回undefined,可通过业务逻辑转为空字符串) - 输入:
John G. is eating a by at House
捕获分组:["John G.", "", "", "House"]
如果需要更强的扩展性(比如适配仅存在at块的场景),可使用拆分后的可选块版本:
^(.*?) is eating a (.*?)(?: by (.*?))?(?: at (.*))?$
内容的提问来源于stack exchange,提问作者chitown88
相关产品推荐
相关产品推荐

