我有一个包含数百个SQL Insert语句的文件。我只想识别那些以HTML段落标记<p>
开头但没有结尾段标记</p>
的语句。
我正在尝试这些行
<p>[^\n]*(?!</p>) <-- a <p> followed by any number of characters until \n and then </p>
这不起作用。以下是样本数据
INSERT INTO `help` VALUES
(1,1,'<p>Radiotherapy uses a beam of high-energy rays (or particles) lymph nodes.</p>'),
(2,1,'<p>EBRT delivers radiation from a machine outside the body. '),
(3,1,'<p>Following lumpectomy radiotherapy <ul><li>Heading</li></ul></p>'),
理想情况下,我会在</p>
附加不存在的地方,例如在插入声明#2中。
答案 0 :(得分:1)
如果您使用此:
(\(\d+,\d+,'<p>.*?)(</p>)?('\),)
您将获得以下部分的参考资料:
(1,1,'<p>Radiotherapy uses a beam of high-energy rays (or particles) lymph nodes.
&lt; - 即前言和正文包括开场P标记</p>
&lt; - 可选的结束P标签..即您可能无法获得2的匹配。'),
&lt; - 结束引号和括号,以及尾随逗号然后您可以将其替换为:
$1</p>$3
(例如使用.NET样式的反向引用)。
即,使用每个反向引用重建字符串,使用明确的结束P标记,无论是否找到一个。
在不了解您的平台的情况下,我无法为您提供正确的正则表达式替换语法。
在.NET中它将是:
string input = @"INSERT INTO `help` VALUES
(1,1,'<p>Radiotherapy uses a beam of high-energy rays (or particles) lymph nodes.</p>'),
(2,1,'<p>EBRT delivers radiation from a machine outside the body. '),
(3,1,'<p>Following lumpectomy radiotherapy <ul><li>Heading</li></ul></p>'),";
Regex r = new Regex(@"(\(\d+,\d+,'<p>.*?)(</p>)?('\),)");
string output = r.Replace(input, "$1</p>$3");
Console.Write(output);
产生此输出:
INSERT INTO `help` VALUES
(1,1,'<p>Radiotherapy uses a beam of high-energy rays (or particles) lymph nodes.</p>'),
(2,1,'<p>EBRT delivers radiation from a machine outside the body. </p>'),
(3,1,'<p>Following lumpectomy radiotherapy <ul><li>Heading</li></ul></p>'),
答案 1 :(得分:1)
如果您确定</p>
后面跟着引号'
,则以下内容适用于Perl(没有notepad ++)
/<p> [^\n]* (?<! <\/p> ) (?=') /gx
(/ x允许空格清晰)。这是一个负面的观察背景,它固定在报价的前瞻上。