希望有人能帮忙解决这个问题......
我在XSLT中使用正则表达式来解析HTML文档,我正在寻找一个正则表达式,它将返回不在有效p标签中的文本。
e.g。
I want to find this text
<p>I don't want to find this text</p>
I want to find this text
答案 0 :(得分:0)
使用正则表达式解析html是一项有风险的业务,在您的情况下更是如此,因为嵌套标记的可能性。你可能不想这样做。
话虽如此,对于所有免责声明,鉴于您提供的简单样本,您可以检查这个骨架解决方案,看看什么会对正则表达式有所作用。我希望其他人能给你一个Dom解析器解决方案。
此骨架解决方案使用此正则表达式:
(?i)<(\w+).*?<\/\1[^>]*>|([a-z][a-z ]+)
请注意,这是解决方案的框架,因为与[a-z][a-z ]+
匹配的I want this
必须进行细化,以包含您希望允许的字符,例如数字,破折号等等。它不能是一个普通的点星,否则会占用被|
左边的正则表达式片段固定的字符串部分。
它是如何运作的?
在这种情况下,您希望排除某些内容不匹配 - 在这种情况下是标记。它类似于regex-matching a pattern unless...
这个问题交替|
的左侧与完整的<something > tags</something >
标记相匹配。我们将忽略这些匹配。右侧匹配并捕获内容&#34;到第2组,我们知道(或希望)它是正确的东西,因为它与左边的表达不匹配。
此程序显示了如何使用正则表达式(请参阅online demo底部的结果):
using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program
{
static void Main() {
string s1 = @"want to find this text
<p>I don't want to find this text</p>
I want to find this text";
var myRegex = new Regex(@"(?i)<(\w+).*?<\/\1[^>]*>|([a-z][a-z ]+)");
var group1Caps = new StringCollection();
Match matchResult = myRegex.Match(s1);
// put Group 2 captures in a list
while (matchResult.Success) {
if (matchResult.Groups[2].Value != "") {
group1Caps.Add(matchResult.Groups[2].Value);
}
matchResult = matchResult.NextMatch();
}
Console.WriteLine("\n" + "*** Matches ***");
if (group1Caps.Count > 0) {
foreach (string match in group1Caps) Console.WriteLine(match);
}
Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();
} // END Main
} // END Program
参考
How to match (or replace) a pattern except in situations s1, s2, s3...