如何解决正则表达式匹配内容直到多字符字符串
| 我输入的输入有缺陷,看起来像这样...foo<p>bar</p>
我想对其进行规范化以将前导文本包装在p标签中:
<p>foo</p><p>bar</p>
用/^([^<]+)/
替换/^([^<]+)/
的正则表达式很容易。问题是,有时前导块包含除p之外的其他标记,如下所示:
foo <b>bold</b><p>bar</p>
这应该将整个块包装在一个新的p中:
<p>foo <b>bold</b></p><p>bar</p>
但是由于简单的正则表达式仅查找<
,所以它停在<b>
并吐出:
<p>foo </p><b>bold</b><p>bar</p> <!-- oops -->
那么我该如何重写正则表达式以匹配ѭ9呢?显然,答案涉及否定的前瞻性,但这对我来说有点深。
(并且在不可避免的“您无法使用正则表达式解析HTML!”注释之前,输入的内容不是随机HTML,而是纯文本,仅带有标签<p>
,<a>
,<b>
和<i>
,以及a / b / i可能没有嵌套。)
解决方法
我认为您实际上希望正面向前。确实不错:
/^([^<]+)(?=<p)/
您只想确保<
之后的值是p
,但是您不想实际消费<p
,因此您要提前使用。
例子:
> var re = /^([^<]+)(?=<p)/g;
> \'foo<p>bar</p>\'.replace(re,\'<p>$1</p>\');
\"<p>foo</p><p>bar</p>\"
> \'foo <b>bold</b><p>bar</p>\'.replace(re,\'<p>$1</p>\')
\"foo <b>bold</b><p>bar</p>\"
抱歉,在我的原始帖子中不够清楚:我期望\ foo粗体位也将被包裹在新的p
标记中,并且没有发生。
另外,有时输入中根本没有p
标记(只是普通的foo
),这也应该映射到<p>foo</p>
。
我发现最简单的方法是使用2个单独的正则表达式/^(.+?(?=<p))/
和/^([^<]+)/
。
> var re1 = /^(.+?(?=<p))/g,re2 = /^([^<]+)/g,s = \'<p>$1</p>\';
> \'foo<p>bar</p>\'.replace(re1,s).replace(re2,s);
\"<p>foo</p><p>bar</p>\"
> \'foo\'.replace(re1,s);
\"<p>foo</p>\"
> \'foo <b>bold</b><p>bar</p>\'.replace(re1,s);
\"<p>foo <b>bold</b></p><p>bar</p>\"
通过组合re1
和re2
可以编写一个等效的正则表达式:
/^(.+?(?=<p)|[^<]+)/
> var re3 = /^(.+?(?=<p)|[^<]+)/g,s = \'<p>$1</p>\';
> \'foo<p>bar</p>\'.replace(re3,s)
\"<p>foo</p><p>bar</p>\"
> \'foo\'.replace(re3,s)
\"<p>foo</p>\"
> \'foo <b>bold</b><p>bar</p>\'.replace(re3,s)
\"<p>foo <b>bold</b></p><p>bar</p>\"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。