正则表达式匹配直至特定顺序字符序列的问题求助
匹配完整标签段的正则解决方案
问题说明
需要匹配从<SERIES>开始到</SERIES>结束的完整文本段,目标文本示例如下:
<SERIES> <OWNER-CIK>0000003521 <SERIES-ID>S000020958 <SERIES-NAME>Alger Small Cap Focus Fund <CLASS-CONTRACT> <CLASS-CONTRACT-ID>C000059340 <CLASS-CONTRACT-NAME>Alger Small Cap Focus Fund Class I <CLASS-CONTRACT-TICKER-SYMBOL>AOFIX </CLASS-CONTRACT> <CLASS-CONTRACT> <CLASS-CONTRACT-ID>C000095961 <CLASS-CONTRACT-NAME>Alger Small Cap Focus Fund Class Z <CLASS-CONTRACT-TICKER-SYMBOL>AGOZX </CLASS-CONTRACT> <CLASS-CONTRACT> <CLASS-CONTRACT-ID>C000179520 <CLASS-CONTRACT-NAME>Class Y <CLASS-CONTRACT-TICKER-SYMBOL>AOFYX </CLASS-CONTRACT> </SERIES> <SERIES>
之前尝试的<SERIES>[^/]+会在遇到</CLASS-CONTRACT>时提前终止;把S加入排除集合后,匹配结束得更早。需要精准匹配到完整</SERIES>前的所有内容。
解决方案
可用正则表达式
根据正则引擎的支持情况,选下面其中一种:
- 支持DOTALL模式(
.可匹配换行符):<SERIES>.*?</SERIES> - 不支持DOTALL模式:
<SERIES>[\s\S]*?</SERIES>
原正则失效原因
<SERIES>[^/]+:[^/]是排除型字符集,会匹配除了/之外的所有字符,所以遇到</CLASS-CONTRACT>里的/就立刻停止匹配,导致提前终止。- 加入S到排除集合后,
[^/S]+会避开所有/和S,遇到<SERIES-ID>里的S就直接停了,匹配范围更短。
正则逻辑解释
<SERIES>:精准匹配起始标签.*?/[\s\S]*?:*?是非贪婪量词,会尽可能少地匹配字符,直到找到第一个</SERIES>就停止,不会过度匹配后续的<SERIES>段</SERIES>:精准匹配结束标签
内容的提问来源于stack exchange,提问作者Luis Ramon Ramirez Rodriguez
相关产品推荐
相关产品推荐

