Справка RegEx - конвертация из JavaScript в C # - PullRequest
4 голосов
/ 05 февраля 2010

У меня есть строка, которую мне нужно сделать для поиска и замены, чтобы удалить начальные и конечные пробелы внутри атрибута. Эффект «до» и «после» показан здесь (визуально и с примером работы JS):

http://lloydi.com/x/re/

Теперь мне нужно сделать эквивалент в C # - заменить все ссылки в строке. Но я действительно застрял. Я знаю, что шаблон правильный, как показано в версии JS, но синтаксис / escape-синтаксис меня не устраивает.

Вот что у меня есть, но, конечно, это не работает; -)

//define the string
string xmlString = "<xml><elementName specificattribute=" 111 222 333333 " anotherattribute="something" somethingelse="winkle"><someotherelement>value of some kind</someotherelement><yetanotherelement>another value of some kind</yetanotherelement></elementName></xml>";

// here's the regExPattern - the syntax checker doesn't like this at all
string regExPattern = "/(specificattribute=)"\s*([^"]+?)\s*"/g";

// here's the replacement
string replacement = "$1\"$2\"";

Regex rgx = new Regex(regExPattern);
string result = rgx.Replace(xmlString, replacement);

Может кто-нибудь сказать мне ошибку моих путей?

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 05 февраля 2010

Не используйте регулярные выражения для этой задачи..NET имеет мощные инструменты для работы с XML-документами.Попробуйте вместо этого:

XDocument doc = XDocument.Load("input.xml");
foreach (XAttribute attr in doc.Descendants("elementName")
                               .Attributes("specificattribute"))
{
    attr.Value = attr.Value.Trim();
}
doc.Save("output.xml");
2 голосов
/ 05 февраля 2010

Удалите / g в конце regExPattern. Это первая ошибка, которую я вижу наверняка. Реализация регулярных выражений .NET не имеет глобального модификатора, по умолчанию она глобальная.

UPDATE:

Я думаю, что это должно работать:

           //define the string
            string xmlString = "<xml><elementName specificattribute=\" 111 222 333333 \" anotherattribute=\"something\" somethingelse=\"winkle\"><someotherelement>value of some kind</someotherelement><yetanotherelement>another value of some kind</yetanotherelement></elementName></xml>";

            // here's the regExPattern - the syntax checker doesn't like this at all
            string regExPattern = "(specificattribute=)\"\\s*([^\"]+?)\\s*";

            // here's the replacement
            string replacement = "$1\"$2\"";

            Regex rgx = new Regex(regExPattern);
            string result = rgx.Replace(xmlString, replacement);

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

Судя по всему, вы действительно должны использовать что-то вроде Xpath или Linq to XML для анализа и изменения этих атрибутов.

Я практически краду ответ Марка Байера, но так как его пример с XML-файлами, и вы делаете это в памяти, это должно выглядеть примерно так:

XDocument doc = XDocument.Parse("<xml><elementName specificattribute=\" 111 222 333333 \" anotherattribute=\"something\" somethingelse=\"winkle\"><someotherelement>value of some kind</someotherelement><yetanotherelement>another value of some kind</yetanotherelement></elementName></xml>");
foreach (XAttribute attr in doc.Descendants("elementName")
                               .Attributes("specificattribute"))
{
    attr.Value = attr.Value.Trim();
}
string result = doc.ToString();
0 голосов
/ 05 февраля 2010

Серьезно, вы должны использовать класс System.Xml для этого. Вот еще один пример использования XPath :

    string xmlString = "<xml><elementName specificattribute=\" 111 222 333333 \" anotherattribute=\"something\" somethingelse=\"winkle\"><someotherelement>value of some kind</someotherelement><yetanotherelement>another value of some kind</yetanotherelement></elementName></xml>";

    XmlDocument xml = new XmlDocument(); ;
    xml.LoadXml(xmlString);

    foreach (XmlAttribute el in xml.SelectNodes("//@specificattribute"))
    {
        el.Value = el.Value.Trim();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...