找到一个正则表达式,得到两个固定表达式之间的一个结构表达式

本文关键字:一个 表达式 之间 结构 正则表达式 两个 | 更新日期: 2023-09-27 18:21:24

我做错了什么?

我正在尝试获得

Someone
Someone Else
Someone W. Bush
Sommone 2

从类似的文本文件

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>[...] - Friends</title>
        <link rel="stylesheet" href="../html/style.css" type="text/css" />
    </head>
    <body>
        <div class="nav">
            <img src="../photos/profile.jpg" />
            <ul>
                <li><a href="../index.htm">Profile</a></li>
                <li><a href="../html/contact_info.htm">Contact Info</a></li>
                <li><a href="../html/wall.htm">Wall</a></li>
                <li><a href="../html/photos.htm">Photos</a></li>
                <li><a href="../html/synced_photos.htm">Synced Photos</a></li>
                <li><a href="../html/videos.htm">Videos</a></li>
                <li class="selected">Friends</li>
                <li><a href="../html/messages.htm">Messages</a></li>
                <li><a href="../html/pokes.htm">Pokes</a></li>
                <li><a href="../html/events.htm">Events</a></li>
                <li><a href="../html/settings.htm">Settings</a></li>
                <li><a href="../html/security.htm">Security</a></li>
                <li><a href="../html/ads.htm">Ads</a></li>
                <li><a href="../html/mobile_devices.htm">Mobile Devices</a></li>
                <li><a href="../html/places.htm">Places</a></li>
                <li><a href="../html/survey_responses.htm">Survey Responses</a></li>
            </ul>
        </div>
        <div class="contents"><h1>[...]</h1><div>
        <h2>Friends</h2>
        <ul>
            <li>Someone</li>
            <li>Someone Else</li>
            <li>Someone W. Bush</li>
            <li>Someone 2</li>
        </ul>
        <h2>Sent Friend Requests</h2>
        <ul><li>Blah blah</li></ul>
        <h2>Received Friend Requests</h2>
        <ul>
            <li>lakjsdak</li>
            <li>adkasd</li>
        </ul>
        <h2>Friend Peer Group</h2>
        <ul>Starting Adult Life</ul>
    </div>
</div>
<div class="footer">Downloaded by [...] on Thursday, November 5, 2015 at 9:54pm PST</div>
</body>
</html>

因此,首先我需要得到<h2>Friends</h2><ul></ul>之间的表达式。然后,我需要从该表达式中获取<li></li>之间有效名称的每个实例。

我使用的正则表达式是

    private static readonly Regex _lregx = new Regex(@"<h2>Friends</h2><ul>'w</ul>", RegexOptions.Compiled); 
    private static readonly Regex _fregx = new Regex(@"/<li>([a-zA-Z0-9. ]+)<'/li>/", RegexOptions.Compiled); 

我像一样使用它们

        using ( StreamReader sr = new StreamReader(newFriendsPath) )
        {
            Match friendsULs = DataReader._lregx.Match(sr.ReadToEnd());
            if ( !friendsULs.Success )
            {
                throw new Exception(String.Format("Couldn't find exactly one piece of HTML matching regex {0}",
                                                    DataReader._lregx.ToString()));                  
            }   
            Dictionary<string, int> friendMap = new Dictionary<string, int>();
            foreach ( Match thisFriendRegex in DataReader._fregx.Matches(friendsULs.ToString()) )
            {
                 // ...

但是

Match friendsULs = DataReader._lregx.Match(sr.ReadToEnd());

没有得到任何匹配。

找到一个正则表达式,得到两个固定表达式之间的一个结构表达式

有这么多错误-最好不要在整个文档上测试-用小段文本测试正则表达式,并在匹配时在大文本上测试。

我看到了:

1) @"<h2>Friends</h2><ul>'w</ul>"-空白区怎么办-至少@"<h2>'s*Friends's*</h2>'s*<ul>'s*'w's*</ul>"应该是

2) 可能的属性和大小写呢?-应该@"(?i)<h2[^>]*>'s*Friends's*</h2>'s*<ul[^>]*>'s*'w</ul>"

3) <ul>'w</ul>到底是什么?你可能认为它是"ul标签限制之间的任何东西",而不是"ul之间只有一个字母",如果你想捕捉标签内部的任何内容(仅用于不嵌套标签),你应该使用以下片段:<ul[^>]*>['s'S]+?</ul>

因此,调试和测试之前的第一个regex应该重写为@"(?i)<h2[^>]*>'s*Friends's*</h2>'s*<ul[^>]*>'s*['s'S]+?</ul>"

再次

1) 在尝试将regex用于硬html解析之前,先从基础知识中学习好regex

2) 测试小文本上的正则表达式

3) 使用正则表达式的HTML-不是最佳实践-更好-搜索并选择工具来转换HTML->XML(其中至少有5个知名的.NET和控制台工具),然后使用XML(XElement/XPath)而不是正则表达式