Regex.IsMatch表达式

时间:2010-07-13 13:42:46

标签: c# regex

的确切Regex.IsMatch表达式可能是什么
span[class|align|style]

我试过这个,但我没有得到确切的预期结果

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

我正在检查span是否包含'style'元素,如果它存在,那么'style'将不会插入'span',反之亦然。

任何指针?

2 个答案:

答案 0 :(得分: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(?=\||\[).*\]"

答案 1 :(得分: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(); 

正如您所看到的,我只花了几分钟,但您的代码可以更强大,更重要的是,可重用。每次要检查或添加属性时,都不必重写该正则表达式。