2012-02-27 54 views
0

我有一個簡單的正則表達式表達式來拉出包含end ** end的字符串中的值,下例。然而,雖然這很愚蠢簡單,我努力獲得我需要的結果!有什麼明顯的我失蹤了! 非常感謝。簡單的新手正則表達式幫助需要

var str = "endhelloend"; 
var match = Regex.Match(str, @"end([a-z]+)end$", RegexOptions.IgnoreCase); 

if(match.Success) 
{ 
    result = match.Groups[0].Value // should return 'hello' 
} 
+0

你的正則表示只有字母可以在結束和結束之間。是這樣嗎?你能提供應該和不應該匹配的樣本情況嗎? – vcsjones 2012-02-27 16:50:14

+0

你想從HTML文件中提取文本內容嗎,你想實現嗎? – 2012-02-27 17:15:53

回答

0

使用溶液1提取html的文本內容,然後通過使用解決方案2過濾來自文本你想要的文字。

  1. 清潔.htm文件中的HTML元素,試試這個:

    string CleanXml(string DirtyXml) 
    { 
        //string clean = ""; 
        int startloc = 0, endloc = 0; 
    
        for (int x = 0; x <= DirtyXml.Length-1; x++) 
        { 
         if (DirtyXml[x] == '<') 
         { 
          startloc = x; 
          x++; 
         } 
         if (DirtyXml[x] == '>') 
         { 
          endloc = x; 
          x++; 
          DirtyXml = DirtyXml.Remove(startloc, (endloc - startloc)+1); 
          x = 0; 
         } 
        } 
        return DirtyXml; 
    } 
    
  2. 正則表達式過濾文本 「endhelloend」 獲得 「你好」 enter image description here

    string result = ""; 
        var str = "endhelloend"; 
        var match = Regex.Match(str, @"end([a-z]+)end$", RegexOptions.IgnoreCase); 
        if(match.Success) 
        { 
         result = match.Groups[1].Value; // Returns 'hello' 
        } 
        Console.WriteLine(result); 
        Console.ReadLine(); 
    
+0

,雖然它不起作用,但使用此 – 2012-02-27 17:04:03

+0

var str = System.IO.File.ReadAllText(@「test.htm」); var match = Regex.Match(str,@「end([a-z] +)end $」,RegexOptions.IgnoreCase); if(match.Success) { var result = match.Groups [1] .Value; //返回 '你好' } STR的內容 – 2012-02-27 17:04:28

+0

是「 你好 endhelloend

這是一個例子

「 – 2012-02-27 17:04:56

3

match.Groups [0]將匹配整個正則表達式 - 看match.Groups [1]。

+0

謝謝,但同時調試matchin.Success評估爲false,所以match.group永遠不會遇到所示示例 – 2012-02-27 16:50:13

+0

你應該把這些信息放在問題中。試試[a-z] +?作爲你的匹配組,看看是否有幫助。 +是缺省iirc的貪婪操作符,所以它可能是匹配結束符,因此不會找到關閉字符串。 – 2012-02-27 16:55:13

+0

使'+'不貪婪不應該有任何效果。貪婪的'[a-z] +'最初會消耗第二個'end',但是它會退回足夠遠以讓剩餘的正則表達式('end $')匹配它所需要的。 – 2012-02-28 05:00:56

4

您的模式正確地包含您想要提取的組。正則表達式匹配將包含您要訪問的組的集合。在你的榜樣,請嘗試以下操作:

var str = "endhelloend"; 
var match = Regex.Match(str, @"end([a-z]+)end$", RegexOptions.IgnoreCase); 

if(match.Success) 
{ 
    var hello = match.Groups[1]; 
} 

match.Groups [0]會返回整場比賽「endhelloend」所以你只是想在比賽中的第一組。

1

我認爲這條線應該是這樣的: result = match.Groups[1].Value;

0

試試這個,它會給你任何字母,單詞之間的,但不會獲得實際的字年底

(?<=end)[a-z]+?(?=end) 
+0

Lookarounds增加了不必要的複雜性,但沒有帶來任何好處。你的正則表達式可以工作,但這是因爲你關閉了'$'(正如@sln所解釋的),而不是因爲查找方式。 – 2012-02-28 05:34:43

+0

@Alan Moore,我實際上故意忽略了** $ **(un):D,這個問題使用字符串* endhelloend *作爲測試,而不是* endhelloend 123 455 ... *查找引入了什麼樣的複雜性?我不認爲它的表現會如此之大,而且我認爲這是更漂亮的'match.Value' – Jason 2012-02-28 14:41:44

1

我看到你這個掙扎,所以我將提供一個有點洞察力。

這個正則表達式end([a-z]+)end$將匹配這個字符串「endhelloend」。
內部文本將在捕獲組1中。
當它的子字符串像這樣
endhelloend of the world」時,它將不匹配相同的字符串。

的原因是你有字符串元字符(斷言)$的一端爲正則表達式
的一部分,只是「結束」之後。

所以你可以在正則表達式中取出$,它應該可以正常工作。
雖然還有其他的事情要考慮。我會評論它,你是正則表達式。

end  // find a literal 'end' 
(   // Capture group 1 open 
    [a-z]+ // Find as many characters a-z as possible (including 'e' 'n' 'd' ins sequence 
)   // Capture group 1 close 
end  // find a literal 'end' 
$   // End of string assertion (the last 'end' must be the last word in the string)