none
регулярные выражения RRS feed

  • Вопрос

  • Есть текст:

    a href="URL"
    text
    text2
    text3
    a href="URL2"

    Чтобы выдрать контент, который идёт после "URL"" и перед "URL2" использую следующее выражение:
    (?<=URL")(.*\s*)*(?=URL2)

    В приведённом выше примере всё работает хорошо. Но с большим объёмом текста (html страница одного из форумов) программа
    начинает жёстко зависать и входит в ступор (Expresso и MS Visual Studio 2008 C#). В случае даже такого выражения:
    .*(?=URL2) тоже виснет.
    Можете подсказать, как эту проблему решить? Может как-то выражение усовершенствовать...
    Можно уже в C# сделать несколько поисков по тексту:
    1. (?<=URL")(.*\s*)* ,
    2. потом из п.1 (?<=URL2)(.*\s*)*
    3. удалить текст из п.2 и тогда получится, то что нужно.
    28 января 2010 г. 1:42

Ответы

  • Если URL и URL2 - просто две фиксированные строки, то быстрее будет не искать regex-ами, а использовать обычные методы String. Что-то вроде
                string source = "a href=\"URL\"text text2 text3 a href=\"URL2\"";
                string url1 = "URL";
                string url2 = "URL2";
                int url1end = source.IndexOf(url1) + url1.Length;
                int url2start = source.IndexOf(url2);
                string res = source.Substring(url1end, url2start - url1end);
    
    Ну или пилить regex-ы. Например, заменить странный паттерн (.*\s*)* на 'эвкивалентный .*, или на .*?. Регекспы не любят паттерны типа (A*)*.
    • Предложено в качестве ответа PashaPash 1 февраля 2010 г. 1:30
    • Помечено в качестве ответа I.VorontsovModerator 3 февраля 2010 г. 9:47
    1 февраля 2010 г. 1:29