regexp,帮助断言

时间:2011-06-02 13:25:03

标签: regex

我有以下字符串:

<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。但它也取代了第二种情况

2 个答案:

答案 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是一个非常有用的正则表达式工具。