2010-07-13 50 views
1

可能是什麼Regex.IsMatch表達

span[class|align|style] 

確切Regex.IsMatch表達我這一個嘗試,但我沒有得到確切的預期的結果

if (!Regex.IsMatch(n.Value, @"span\[.*?style.*?\]", RegexOptions.IgnoreCase)) 
    n.Value = Regex.Replace(n.Value, @"(span\[.*?)(\])", "$1" + ValToAdd + "$2"); 

我檢查如果跨度包含'style'元素,如果它存在,'style'將不會與'span'一起插入,反之亦然。

任何指針?

+1

小心張貼你得到的結果嗎? – Amarghosh 2010-07-13 14:07:04

回答

2

您忘記了在ValToAdd之前添加|

if (!Regex.IsMatch(n.Value, @"span\[.*?\bstyle\b.*?\]", RegexOptions.IgnoreCase)) 
    n.Value = Regex.Replace(n.Value, @"(span\[.*?)\]", "$1|" + ValToAdd + "]"); 

另外,你的第一個正則表達式匹配span[class|align|somestyle]。使用單詞邊界\b來匹配整個單詞。請注意,在非單詞字符之前和之後,這仍然匹配span[class|align|some-style],因爲\b匹配。以下正則表達式僅匹配由[||||]包圍的那些style

@"span\[.*(?<=\||\[)style(?=\||\[).*\]" 
+0

我保持ValToAdd像這樣 (字符串ValToAdd =「| style」;) – SAK 2010-07-13 14:18:33

+0

@sam你說'我沒有得到準確的預期結果' - 謹慎發佈你得到的輸出? – Amarghosh 2010-07-13 14:28:43

+0

我正在檢查的條件(Regex.IsMatch)是我在這裏的意思,因爲預期的結果.. – SAK 2010-07-13 14:35:10

1

,因爲我喜歡的正則表達式,如果你在你的程序,你會用一個小的類來表示你的令牌做得更好經常這樣做一樣多。認爲這是一個粗略的草圖:

public class SamToken 
{ 
    public string Head { get; set; } 
    private readonly HashSet<string> properties; 
    public HashSet<string> Properties{ 
     get{return properties; } 
    } 

    public SamToken() : this("") { } 

    public SamToken(string head) 
    { 
     Head = head; 
     properties = new HashSet<string>(StringComparer.OrdinalIgnoreCase); 
    } 

    public void Add(params string[] newProperties) 
    { 
     if ((newProperties == null) || (newProperties.Length == 0)) 
      return; 
     properties.UnionWith(newProperties); 
    } 

    public override string ToString() 
    { 
     return String.Format("{0}[{1}]", Head, 
      String.Join("|", Properties)); 
    } 
} 

接下來,你可以使用函數從字符串解析一個道理,東西線中:

public static SamToken Parse(string str) 
{ 
    if (String.IsNullOrEmpty(str)) 
     return null; 
    Match match = Regex.Match(str, @"^(\w*)\[([\w|]*)\]$"); 
    if (!match.Success) 
     return null; 
    SamToken token = new SamToken(match.Groups[1].Value); 
    token.Add(match.Groups[2].Value.Split('|')); 
    return token; 
} 

有了這樣的事情,這將是容易添加屬性:

SamToken token = SamToken.Parse("span[hello|world]"); 
token.Add("style", "class"); 
string s = token.ToString(); 

正如你所看到的,我只放了幾分鐘,但你的代碼可以是更強大,更重要的是,可重複使用。每次您想要檢查或添加屬性時,都不必重寫該正則表達式。