簡體   English   中英

正則表達式,除特定匹配項外,與模式匹配的表達式

[英]Regex Expression that matches a pattern except for specific matches

我正在嘗試使用RegEx從HTML響應中提取名稱。 到目前為止,我已經可以做到了,除了得到的東西超出了我的需要之外,我不想匹配特定的字符串,例如“ Date”或“ Today”。

這是我的正則表達式:

<li class="rcbItem">([^:()]{1,20})<\/li>

這是我正在運行模式的HTML響應的一部分:

            <div class="rcbSlide" style="z-index:6000;">
                <div id="ctl07_ddInspector_DropDown" class="RadComboBoxDropDown RadComboBoxDropDown_Default " style="float:left;display:none;">
                    <div class="rcbScroll rcbWidth" style="width:100%;">
                        <ul class="rcbList" style="list-style:none;margin:0;padding:0;zoom:1;">
                            <li class="rcbItem">...Default Inspector (if any)</li>
                            <li class="rcbItem">Andy Schene</li>
                            <li class="rcbItem">gilberto hubner</li>
                            <li class="rcbItem">Jim Tinner</li>
                            <li class="rcbItem">Kenneth Donovan</li>
                            <li class="rcbItem">RENTAL REG INSPECTORS</li>
                            <li class="rcbItem">Rob Barker</li>
                            <li class="rcbItem">Robert Costello</li>
                            <li class="rcbItem">Ryan BalFour</li>
                            <li class="rcbItem">Sean Angeley</li>
                            <li class="rcbItem">Krissy King</li>
                        </ul>
                    </div>
                </div>
            </div>
            <input id="ctl07_ddInspector_ClientState" name="ctl07_ddInspector_ClientState" type="hidden" />
        </div>
        <span id="ctl07_lblInspector" class="pnlData"/>
    </td>
</tr>
<tr>
    <td>
        <span id="ctl07_lblSetDefaultLabel" class="pnlLabelLight">Set Default</span>
    </td>
    <td>
        <div id="ctl07_ddSetDefault" class="RadComboBox RadComboBox_Default pnlDD" style="width:175px;">
            <table summary="combobox" border="0" style="border-width:0;border-collapse:collapse;table-layout:fixed;width:100%">
                <tr class="rcbReadOnly">
                    <td class="rcbInputCell rcbInputCellLeft" style="margin-top:-1px;margin-bottom:-1px;width:100%;">
                        <input name="ctl07$ddSetDefault" type="text" class="rcbInput radPreventDecorate" id="ctl07_ddSetDefault_Input" value="Next Day (Default)" style="display: block;" readonly="readonly" />
                    </td>
                    <td class="rcbArrowCell rcbArrowCellRight" style="margin-top:-1px;margin-bottom:-1px;">
                        <a id="ctl07_ddSetDefault_Arrow" style="overflow: hidden;display: block;position: relative;outline: none;">select</a>
                    </td>
                </tr>
            </table>
            <div class="rcbSlide" style="z-index:6000;">
                <div id="ctl07_ddSetDefault_DropDown" class="RadComboBoxDropDown RadComboBoxDropDown_Default " style="float:left;display:none;">
                    <div class="rcbScroll rcbWidth" style="width:100%;">
                        <ul class="rcbList" style="list-style:none;margin:0;padding:0;zoom:1;">
                            <li class="rcbItem">Next Day (Default)</li>
                            <li class="rcbItem">Today</li>
                            <li class="rcbItem">Specified Date</li>
                            <li class="rcbItem">Next Available (Insp Cap)</li>
                            <li class="rcbItem">No Specified Date</li>
                        </ul>
                    </div>
                </div>
            </div>

我知道負面的前瞻和另一篇文章:正則表達式,它匹配一個模式,但不匹配特定的單詞 但是我不能為我工作。 以下內容仍帶回不需要的匹配項:

<li class="rcbItem">((?!Date$)[^:()]{1,20})<\/li>
  1. 您不希望使用Date$因為$表示“這是字符串的結尾”。
  2. 由於您的示例顯示包含“ Date”的不需要的字符串恰好出現在</li>之前,因此您想在此處而不是更早地使用否定環顧四周。
  3. 現在,由於您要向后查找“日期”,因此需要先行查找,而不要先行查找。 (在您的中間添加< ?!

最終看起來像:

<li class="rcbItem">([^:()]{1,20})(?<!Date)<\/li>

如果您還嘗試刪除“今天”條目,則將其設為“ Today|Date

<li class="rcbItem">([^:()]{1,20})(?<!Today|Date)<\/li>

PS:您真的需要一開始檢查所有空白嗎?

由於“日期”或“今天”的位置不固定,因此我的建議是:

string[] filter = {"date","today"};
var result = Regex.Matches(yourhtml,"(?i) <li class=\"rcbItem\">([^:()]{1,20})<\/li>")
.Cast<Match>()
.Where(m=>!filter.Any(f=>m.Groups[1].Value.ToLower().Contains(f)));

您不能使用$因為它表示整個字符串的結尾。

試試這個:

<li class="rcbItem">((?!(.)*(Date|Today))[^:()]{1,20})<\/li>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM