Регулярное выражение не соответствует
У меня есть строка с очень нечистым 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()
; Это будет текст, заключенный в теги шрифта без пробелов по краям.