2015-09-20 4 views
0

У меня длинная строка (html сайта), и я хочу очистить подстроки.Regex найти подстроки строки, отсутствующие некоторые части

Например, часть продукции содержит что-то вроде этого:

<span title="Minecraft: Pocket Edition" class="oneline-info title-info"> 
    <a href="/apps/ios/app/minecraft-pocket-edition/">Minecraft: Pocket Edition</a> 
</span> 


    <span title="Mojang" class="oneline-info add-info" data-items="1"> 
     <a href="/apps/ios/publisher/mojang/">Mojang</a> 
    </span> 

Я хочу, чтобы очистить все от <span title= до </span> (В приведенном выше примере, что означает, что он будет 2 разные матчи)

Итак, у меня есть этот код:

 var matches = Regex.Matches(s, @"<span title=(?<content>(?:(?!""</span>).)+)"); 
     scrapeTitles.AddRange(matches.Cast<Match>().Select(x => x.Groups["content"].Value).ToList()); 

Но по какой-то причине, не очищая все данные между этими 2 словами. Это только дает мне выходы, как это:

"Minecraft: Pocket Edition" class="oneline-info title-info"> 
"Mojang" class="oneline-info add-info" data-items="1"> 
"Clash of Clans" class="oneline-info title-info"> 
"Supercell" class="oneline-info add-info" data-items="1"> 

мне нужно, чтобы очистить все данные, в том числе <a> линии, а также.

"Mojang" class="oneline-info add-info" data-items="1"> 
      <a href="/apps/ios/publisher/mojang/">Mojang</a> 

ответ

2

Проблема ваш матч не должным образом заботиться о новой линейный символ.

Попробуйте это:

<span title=(?<content>(?:(.|\n)(?!</span>))+) 

См live version.

Отказ от ответственности: Я stronly рекомендую НЕ сделать HTML (SGML) фактически синтаксический с использованием регулярных выражений. В конечном итоге это приводит к нарушенному поведению.

1

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

var matches = Regex.Matches(s.Replace(Environment.NewLine, string.Empty), @"<span title=(?<content>(?:(?!""</span>).)+)"); 
Смежные вопросы