Выражение Regex.IsMatch - PullRequest
       1

Выражение Regex.IsMatch

1 голос
/ 13 июля 2010

Каким может быть точное выражение 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 ]

2 голосов
/ 13 июля 2010

Вы забыли добавить | перед 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 s, которые окружены [| или || или |].

@"span\[.*(?<=\||\[)style(?=\||\[).*\]"
1 голос
/ 13 июля 2010

Как бы мне ни нравились регулярные выражения, если вы будете часто делать это в своей программе, вам будет лучше с небольшим классом для представления ваших токенов. Считайте это грубым наброском:

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(); 

Как видите, я потратил всего несколько минут, но ваш код может быть гораздо более надежным и, что более важно, многократно используемым. Вам не нужно переписывать это регулярное выражение каждый раз, когда вы хотите проверить или добавить свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...