如何编写正则表达式匹配test:property自定义模式及多值场景
最终可用正则
1. 完整匹配目标属性片段(通用版,适配所有正则引擎)
该正则可精准匹配test:property对应的完整片段,不会错误粘连前后其他属性内容:
\btest:property:(?:\()?\w+:\w+(?:\sOR\s\w+:\w+)*(?:\))?\b
2. 支持重复捕获组的引擎版本
如果你的开发环境使用支持重复捕获组的正则引擎(如.NET、Python第三方regex模块),可直接用以下正则,所有TypeName会被捕获到第2个及之后的分组中:
\b(test:property:(?:\()?(\w+:\w+)(?:\sOR\s(\w+:\w+))*(?:\))?)\b
如果使用不支持重复捕获的引擎(如JavaScript、Python标准re库),可先用通用版正则匹配出完整目标片段,再用\w+:\w+在匹配结果中提取所有TypeName即可。
正则规则说明
\b:单词边界,确保匹配到的是独立属性片段,不会和前后其他属性内容粘连test:property::固定匹配目标属性名加冒号(?:\()?:非捕获组,可选匹配左括号,?:标识该分组不需要单独捕获\w+:\w+:匹配TypeName格式要求:1个以上单词字符+冒号+1个以上单词字符(?:\sOR\s\w+:\w+)*:非捕获组,匹配0次或多次「空格+OR+空格+TypeName」结构,适配多值场景(?:\))?:非捕获组,可选匹配右括号
示例匹配结果
针对你给出的4个测试场景,该正则输出完全符合预期:
| 序号 | 匹配内容 | 提取到的TypeName |
|---|---|---|
| 1 | test:property:schema:Person | schema:Person |
| 2 | test:property:(schema:Person OR schema:Organization OR schema:Place) | schema:Person、schema:Organization、schema:Place |
| 3 | test:property:(schema:Person) | schema:Person |
| 4 | test:property:schema:Person | schema:Person |
如果需要做属性和值替换,可先匹配到完整片段后,替换前缀test:property:为目标属性名,再将提取到的TypeName替换为对应目标值即可。
内容的提问来源于stack exchange,提问作者Stuart Leyland-Cole
相关产品推荐
相关产品推荐

