的确切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',反之亦然。
任何指针?
答案 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();
正如您所看到的,我只花了几分钟,但您的代码可以更强大,更重要的是,可重用。每次要检查或添加属性时,都不必重写该正则表达式。