none
Regular expression的搜尋與排除 RRS feed

  • 問題

  • 各位好,最近在使用Regular expression作搜尋,

    但因為對於Regular expression不夠熟悉,所以碰到些小問題想請問大家

    我的Simple Text如下

    <span>123456789</span> <span>123456789</span>
    <br>
    <input type="text" value="123456789"></input>
    <input type="text" value="123456789" />

    主要我要篩選出 123456789,
    同時我篩選時,需要除掉 123456789 在<input> 裡面的狀況,

    123456789 可以用  (123456789)  來篩選,
    當有文字存在<input>裡面,我可以用(\<input.+?\<\/input\>)|(\<input.+?\/\>)來塞選,

    問題是,我該將這兩個 pattern 混合使用,

    使選出來的結果,只會塞選除前面兩行,

    <span>123456789</span>
    <span>123456789</span>

    而不包含

    <input type="text" value="123456789"></input>
    <input type="text" value="123456789" />

    備註

    123456789 與 pattern-(123456789)只是測試文字,之後會修改成其他的pattern

    感謝
    • 已編輯 Bruce_柏 2012年10月11日 上午 08:56
    2012年10月11日 上午 08:56

解答

  • 你會用Expresso那就好辦。

    一、http://www.dotblogs.com.tw/johnny/archive/2010/01/25/13301.aspx 先加強你對RegEx的瞭解。

    二、一一修正的RegEx語法。

    三、RegEx一次最好只針對一個目標,多目標,我是建議拆成多個過濾式,符合第一個再送去給第二過濾,這樣找問題點時才簡單些。


    理直氣和,切記。

    http://blog.kkbruce.net

    • 已標示為解答 Bruce_柏 2012年10月12日 上午 06:06
    2012年10月12日 上午 03:53
  • 提個建議, 你可以把"匹配"與"置換" 分開來想

    1. 匹配到 input + 12345678 pattern 者不置換

    2. 匹配到 12345678 pattern 者置換

    大致上的語法是

    (input + 12345678 pattern) | (12345678 pattern)

    1. 匹配到前者群組不置換

    2. 沒有匹配到前者群組, 但匹配到後者置換

    示意的程式如下

    Assert.AreEqual("SPAN AB LINK", Regex.Replace("SPAN AB", "(INPUT AB)|(AB)", m => m.Groups[1].Success ? m.Groups[1].Value : m.Groups[2].Value + " LINK"));
    
    Assert.AreEqual("INPUT AB", Regex.Replace("INPUT AB", "(INPUT AB)|(AB)", m => m.Groups[1].Success ? m.Groups[1].Value : m.Groups[2].Value + " LINK"));
    


    2012年10月13日 下午 05:36

所有回覆

  • 我直覺的想法是:

    先將含有input的用空字串取代再篩選

    或是直接篩選然後再把含有input的剃除掉


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2012年10月11日 下午 12:12
  • 你兩個合用時,條件是怎麼下的?


    理直氣和,切記。

    http://blog.kkbruce.net

    2012年10月11日 下午 11:36
  • To Alex~ 

    主要是希望一次篩選出來,然後會使用Regex.Replace 去做後續的一些處理。

    To KKBruce~

     嘗試這樣下

    (123456789)|(!((\<input.+?\<\/input\>)|(\<input.+?\/\>)))

    但明顯沒達到我想要的效果..


    我還是描述一下我最後希望要做的事情。

    目前我要做的是利用Regular expression去掃整份HTML檔案,
    當搜尋到符合的資料時(例如123456789與987654321都符合某個Regular格式),
    會在該文字後面插入一個link,

    例如..

    <span>123456789</span>
    <span>987654321</span>
    
    To
    
    <span>123456789<a title="123456789" href="tel:123456789"/> </span>
    <span>987654321 <a title="987654321"  href="tel:987654321"/></span>

    然而不論是用插入,或是取代來做,都先必須去除掉當這串文字在 <input></input> 的tag裡面。

    或是除了利用Regular expression,是否也有其他的方法能做?


    • 已編輯 Bruce_柏 2012年10月12日 上午 03:33
    2012年10月12日 上午 03:03
  • 你會用Expresso那就好辦。

    一、http://www.dotblogs.com.tw/johnny/archive/2010/01/25/13301.aspx 先加強你對RegEx的瞭解。

    二、一一修正的RegEx語法。

    三、RegEx一次最好只針對一個目標,多目標,我是建議拆成多個過濾式,符合第一個再送去給第二過濾,這樣找問題點時才簡單些。


    理直氣和,切記。

    http://blog.kkbruce.net

    • 已標示為解答 Bruce_柏 2012年10月12日 上午 06:06
    2012年10月12日 上午 03:53
  • 這個結果是你要的嗎?


    理直氣和,切記。

    http://blog.kkbruce.net

    2012年10月12日 上午 04:02
  • 原本是希望直接一次搜尋出來

    主要是只會match 前面兩個

    而後面有被input包住的地方,不會match到,

    看來多次來過濾,會比較好,也對後續的維護會方便一些,

    感謝你!! 

    2012年10月12日 上午 06:06
  • 提個建議, 你可以把"匹配"與"置換" 分開來想

    1. 匹配到 input + 12345678 pattern 者不置換

    2. 匹配到 12345678 pattern 者置換

    大致上的語法是

    (input + 12345678 pattern) | (12345678 pattern)

    1. 匹配到前者群組不置換

    2. 沒有匹配到前者群組, 但匹配到後者置換

    示意的程式如下

    Assert.AreEqual("SPAN AB LINK", Regex.Replace("SPAN AB", "(INPUT AB)|(AB)", m => m.Groups[1].Success ? m.Groups[1].Value : m.Groups[2].Value + " LINK"));
    
    Assert.AreEqual("INPUT AB", Regex.Replace("INPUT AB", "(INPUT AB)|(AB)", m => m.Groups[1].Success ? m.Groups[1].Value : m.Groups[2].Value + " LINK"));
    


    2012年10月13日 下午 05:36
  • string pattern = @"(?<!\<input.+?)123456789(?!\</input\>)";
    string input = @"<span>123456789</span>
    <span>123456789</span>
    <br>
    <input type=""text"" value=""123456789""></input>
    <input type=""text"" value=""123456789"" />";
    string result = Regex.Replace(input, pattern, m => m.Value + @"<a title=""123456789"" href=""tel:123456789""/>");
    2012年10月16日 上午 11:48