我有以下字符串:
<a name="subhd_182"></a>
<a name="st_394"></a>
<a name="st_395"></a>
<a name="qn_494"></a>
<a name="st_495"></a>
<a name="qn_594"></a>
<a name="st_595"></a>
<a name="subhd_282"></a>
<a name="qn_694"></a>
<a name="st_695"></a>
<a name="qn_794"></a>
<a name="st_795"></a>
<a name="qn_894"></a>
<a name="st_895"></a>`
我希望将每个<a name="st_\d*"></a>
替换为<a name="qn_\d*"></a>
,如果紧随其后<a name="subhd_\d*"></a>
我使用此正则表达式%(.*<a name="subhd_.*)(?=<a name="st(?!<a name="qn))(<a name=")st(.*)%sU
并替换为$1$2qn$3
。但它也取代了第二种情况
答案 0 :(得分:2)
我假设您只想在上面的第一个subhd行之后匹配名称,而不是第二个,因为第一个是“st_”而第二个是“qn _”。
尝试:
(<a name="subhd_\d+">\s*<\/a>\s*<a name=")st(_\d+">)
你将替换为$1qn$2
注意,在这里我假设你说“它立即跟随你是非常直接的。”
我真的不明白你为什么要抛弃先行,除非你试图实施的实际规则比你说的要复杂。
答案 1 :(得分:1)
尝试:%(<a name="subhd_\d+"></a>\n<a name=")st(.*)%sU
并替换为$1qn$2
。在旁注中,我真的不知道U修饰符在这里为你做了什么。此外,您可能希望根据您的操作系统更改\n
换行符匹配器。
我发现RegExr是一个非常有用的正则表达式工具。