正则表达式不匹配

时间:2010-05-03 09:27:19

标签: regex cocoa-touch iphone-sdk-3.0 regexkitlite

我有一个非常不干净的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 个答案:

答案 0 :(得分:1)

Amarghosh和关联问题的获胜回答者bobince对此一般都是正确的。但是,由于你只是进行消毒,所以regexp实际上很好。

首先,剥离标签:

s/<.*?>//

然后将所有多余的空格折叠成一个:

s/\s+/ /

然后删除前导/尾随空格:

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

然后获取值:

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

答案 1 :(得分:0)

我有一些怀疑为什么你的正则表达式可能会失败(不知道iPhone SDK中字符串转义的规则):点.用于必须匹配换行符的地方,斜线看起来像它不必要地逃脱等等。

但是:在您的示例中,您尝试提取的文本的特征是没有被标记包围。

因此,搜索(?m)^[^<>\r\n]$的所有出现都应找到所有匹配项。

答案 2 :(得分:0)

如果你确定你的html代码层次结构,那么你可以只提取font-tags包含的文本:

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()

它将是由font-tags包围的文本,边缘没有空格符号。