2015-06-17 64 views
3

我試圖獲得一部分字符串。用正則表達式獲得匹配值的一部分

使用這個表達式:

@"<a .*href=""(?<Url>(.*))(?="")""" 

實例數據來匹配:

var input = @"<html lang=""en""> 
    <head> 
     <link href=""http://www.somepage.com/c/main.css"" rel=""stylesheet"" type=""text/css"" /> 

     <link rel=""canonical"" href=""http://www.somepage.com"" /> 
     <script src=""http://www.somepage.com/professional/bower_components/modernizr/modernizr.js"" type=""text/javascript""></script> 
    </head> 
     <body> 
      <header> 
       <div> 
        <div> 
         <a aria-haspopup=""true"" href=""http://www.somepage.com/someotherpage""><img src=""http://www.somepage.com/i/sprite/logo.png"" alt=page"" /></a> 
        </div> 
       </div> 
      </header> 
     </body> 
    </html>" 

現在我能得到這個值:

http://www.somepage.com/someotherpage\"><img src=""http://www.somepage.com/i/sprite/logo.png"" alt=page"" /></a> 

與此代碼:

var regexPattern = new Regex(PATTERN, RegexOptions.IgnoreCase); 
var matches = regexPattern.Matches(httpResult); 
foreach (Match match in matches) 
{ 
    // here I'm getting this value 
    var extractedValue = match.Groups["Url"].Value; // it's value is http://www.somepage.com/someotherpage\"><img src=""http://www.somepage.com/i/sprite/logo.png"" alt=page"" /></a> 
} 

我想要得到的match.Groups["Url"].Value很簡單http://www.somepage.com/someotherpage沒有任何東西hrefattribute值。

難道只有在extractedValue上使用Substring才能獲得匹配部分?

回答

2

你幾乎在那裏。只是你的正則表達式中的一個小的變化,不允許匹配集合中的引號。

<a .*href=""(?<Url>([^"]*))(?="")"" 
        //^^^^ This is what i changed. 
1

也許這會工作。不幸的是我現在沒有時間去測試它:

"<a[^>]*href=\"(?<Url>([^\"]+))\"[^>]*>" 
+0

它的工作就像我需要:) – harry180

0

使用此模式代替時,如果不使用.*模塊(更快的處理),則回溯更少。此外,該模式使用\x22作爲"更容易操作該模式,因爲它避免了C#文字混淆問題。

Regex.Matches(input, @"<a.+href=\x22(?<Url>[^\x22]+).+/a>") 
    .OfType<Match>() 
    .Select (mt => mt.Groups["Url"].Value); 
    // Result = http://www.somepage.com/someotherpage 
相關問題