如何使用正则匹配<description>标签之间的所有指定字符'o'
问题分析
你之前写的两个正则都存在逻辑缺陷:
- 第一个
(?<=description\>)o(?=\<\/description)的问题:仅能匹配紧跟在<description>标签后第一个位置的字符o,无法匹配标签中间的o,且末尾正向预查缺少闭合的>,匹配范围判断完全失效 - 第二个正则存在括号不匹配的语法错误,逻辑上也无法实现标签内部全范围匹配的效果
正确实现方案
方案1:支持变长后顾的正则引擎(.NET、Python regex库、Java 9+等)
开启**单行模式(DOTALL/s标志,即.可以匹配换行符)**后,使用如下正则:
(?<=<description>.*?)o(?=.*?</description>)
逻辑说明:
(?<=<description>.*?)正向后顾:确认当前o的前面存在<description>标签,中间可以有任意字符o匹配目标字符(?=.*?</description>)正向预查:确认当前o的后面存在闭合的</description>标签
方案2:不支持变长后顾的正则引擎(JavaScript、旧版Java、Python标准re库等)
分两步处理:
- 先使用正则
<description>(.*?)</description>(同样开启单行+全局匹配模式)提取所有<description>标签的内部内容 - 对每个提取到的内部内容,单独用正则
o做全局匹配,得到所有目标字符
注意事项
该正则方案仅适用于无嵌套<description>标签、标签无自定义属性的规整XML场景。如果是格式复杂的XML文档,更推荐先用XML解析器提取对应标签的内容后再做匹配,正则本身不适合处理嵌套层级复杂的标记类语言。
内容的提问来源于stack exchange,提问作者Machine
相关产品推荐
相关产品推荐

