Регулярное выражение не соответствует - PullRequest
0 голосов
/ 03 мая 2010

У меня есть строка с очень нечистым 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 ]

1 голос
/ 03 мая 2010

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

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

s/<.*?>//

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

s/\s+/ /

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

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

Тогда получите значения:

^([^ ]+) ([^ ]+) ([^ ]+)$
0 голосов
/ 03 мая 2010

Если вы уверены в своей иерархии 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()

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

0 голосов
/ 03 мая 2010

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

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

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

...