我正在尝试在另外两个字符串之间拉出一个字符串。但为了使其更加复杂,进程内容往往会有所不同。
我想要检索的字符串是基督城。
我到目前为止的正则表达式是(?<=300px">).*(?=</td)
,它会拉出我看起来很好的字符串,但它也会在我正在搜索的LARGE文本文件中返回许多其他字符串。
我想做的是限制前缀从 Office 开始,一直到 300px“&gt; ,但内容之间这两个字符串有时会因用户偏好而有所不同。
要将其置于粗糙的非正则表达式术语中,我想执行以下操作:从Office:
开始一直到300px>
找到从此处开始并以</td
结尾的字符串。因此导致基督城。
答案 0 :(得分:3)
您是否考虑过使用HTMLAgilityPack?它是一个用于处理HTML的Nuget包,它能够很好地处理格式错误的HTML。 Stack Overflow上的大多数建议不要使用Regex for HTML - 请参阅此处:RegEx match open tags except XHTML self-contained tags
以下是您为自己的榜样做的事情:
using HtmlAgilityPack; //This is a nuget package!
var html = @"<tr >
<td align=""right"" valign=""top""><strong>Office:</strong> </td>
<td align=""left"" class=""stippel"" style=""white-space: wrap;max-width:300px"">Christchurch </td>
</tr>";
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
var node = htmlDoc.SelectSingleNode("//td[@class='stippel']");
Console.WriteLine(node.InnerHtml);
我还没有测试过这段代码,但它应该做你需要的。
答案 1 :(得分:0)
您遇到的问题是*
贪婪。使用懒惰/不情愿的版本*?
。
Office:[\s\S]*?300px">(.*?)</td
此解决方案使用组匹配而不是环顾。
答案 2 :(得分:0)
我猜你需要这样的东西:
office.*\n.*|(?<=300px">).*(?=<\/td)
答案 3 :(得分:0)
感谢adamdc78和greg的帖子,我已经能够提出以下正则表达式。这正是我所需要的。
谢谢你的帮助。
(?<=office.*\n.*300px">).*(?=<\/td)