Регулярное выражение не соответствует

У меня есть строка с очень нечистым HTML. Прежде чем разобрать его, я хочу преобразовать это:

<TABLE><TR><TD width="33%" nowrap=1><font size="1" face="Arial">
NE
</font> </TD>
<TD width="33%" nowrap=1><font size="1" face="Arial">
DEK
</font> </TD>
<TD width="33%" nowrap=1><font size="1" face="Arial">
143
</font> </TD>
</TR></TABLE>

в NE DEK 143 так что разобрать немного проще. У меня есть это регулярное выражение (RegexKitLite):

NSString *str = [dataString stringByReplacingOccurrencesOfRegex:@"<TABLE><TR><TD width=\"33%\" nowrap=1><font size=\"1\" face=\"Arial\">(.+?)<\\/font> <\\/TD>(.+?)<TD width=\"33%\" nowrap=1><font size=\"1\" face=\"Arial\">(.+?)<\\/font> <\\/TD>(.+?)<TD width=\"33%\" nowrap=1><font size=\"1\" face=\"Arial\">(.+?)<\\/font> <\\/TD>(.+?)<\\/TR><\\/TABLE>" 
                                                     withString:@"$1 $3 $5"];

Я не эксперт в Regex. Может ли кто-нибудь помочь мне здесь?

С уважением, Додо

3 ответа

Решение

Амаргош и Бобинс, победитель ответов на связанные вопросы, как правило, правы в этом. Однако, так как вы просто дезинфицируете, регулярные выражения на самом деле просто хороши.

Сначала удалите теги:

s/<.*?>//

Затем сверните все лишние пробелы в один:

s/\s+/ /

Затем удалите начальное / конечное пространство:

s/^\s+|\s+$//

Затем получите значения:

^([^ ]+) ([^ ]+) ([^ ]+)$

У меня есть несколько подозрений о том, почему ваше регулярное выражение может потерпеть неудачу (не зная правил экранирования строк в iPhone SDK): точка . используется в местах, где он должен соответствовать символам новой строки, слеш выглядит так, как будто он без необходимости экранирован и т. д.,

но: в вашем примере текст, который вы пытаетесь извлечь, характеризуется отсутствием тегов.

Так что поиск всех случаев (?m)^[^<>\r\n]$ должен найти все совпадения.

Если вы уверены в своей иерархии HTML-кода, то вы можете просто извлечь текст, заключенный в теги шрифта:

Regex r = Regex(@"<\s*font((\s+[^<>]*)|(\s*))>(?<desiredText>[^<>]*)<\s*/\s*font\s*>")
//C# example
foreach(Match m in r.Matches(txt))
   result += m.Groups["desiredText"].Value.Trim()

; Это будет текст, заключенный в теги шрифта без пробелов по краям.

Другие вопросы по тегам