正则表达式中大小写(title)和(TEXYAREA)的区别???
我在写一个程序,用来分拣html文件的若干数据。使用正则表达式获得title的内容时,使用"(title)(.*?)(title)"是可以的(当然我会另外把title等去掉)。
但是在想取得TEXTAREA标签内的字符串时,使用(TEXTAREA)(.*?)(TEXTAREA)却无法匹配成功。我不知道是不是大小写的关系,因为html文件里TEXTAREA就是大写的。我改成小写的也无效。
该文件里只有一对TEXTAREA标签。
求教各位高手!谢谢了!!
问题点数:40、回复次数:14Top
1 楼jasonpower(新丁)回复于 2006-03-09 14:54:47 得分 0
我把html文件里的TEXTAREA标签也改成小写的textarea,还是没有匹配成功!!
我把程序写成if(匹配)显示匹配值 else 显示该html文件的全部字符。出来的结果就是显示全部,也就是说读文件是没错的呀!!
真奇怪!!Top
2 楼min_jie(止戈)回复于 2006-03-09 15:02:31 得分 0
估计是你的代码写得有问题。。。
当然正则表达式也可以写得更好一些。。
TEXTAREA(.*?)/TEXTAREATop
3 楼jasonpower(新丁)回复于 2006-03-09 15:16:11 得分 0
代码应该没有错,我如果把那段的TEXTAREA改为title,结果栏里是可以出现title标签里的字符串的。。Top
4 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2006-03-09 15:23:14 得分 0
把你要取的原始文件贴出来。Top
5 楼min_jie(止戈)回复于 2006-03-09 15:35:42 得分 0
可能是你的标签写错了。。
没见过TEXYAREA的标签。。是TEXT吧?Top
6 楼jasonpower(新丁)回复于 2006-03-09 16:10:33 得分 0
标题里是打错了,程序里没有错,是TEXTAREA。
原始文件太大了,我截取了一些。
<html>
<head>
<title>我不够爱你</title>
<tr>
<td width="96" height="20" align="center" valign="top" bgcolor="649AF7"><font color="#FFFFFF">歌词</font></td>
<td height="20" colspan="3" bgcolor="#FFFFFF">
<TEXTAREA cols="60" rows="16" wrap=VIRTUAL style="BORDER-RIGHT: DBCFC4 1px solid; BORDER-TOP: DBCFC4 1px solid; FONT-SIZE: 12px; BORDER-LEFT: DBCFC4 1px solid; BORDER-BOTTOM: DBCFC4 1px solid; FONT-FAMILY: '宋体'; BACKGROUND-COLOR: #ffffff">
不能在没有月亮的夜里
也不能轻易地闭上眼睛
因为你会出现在天空或心里
不能在一望无际的地方
也不能钻进了拥挤人群
因为寂不寂寞 都会提醒我
我失去了我不够爱的你</TEXTAREA>
程序部分:
//歌词
Regex regstr3 = new Regex("TEXTAREA(.*?)/TEXTAREA",RegexOptions.Compiled);
Match mastr3 = regstr3.Match(strstream);//strstream是读原始文件获得的字符串
if(mastr3.Success)
{
Txtly.Text += I.ToString() + ";" + mastr31.Value+ "\r\n";
}
else
{
Txtly.Text += I.ToString() + ";" + strstream + "\r\n";
}
结果出现的就是全部字符串。Txtly是显示结果的web文本框。
郁闷ingTop
7 楼min_jie(止戈)回复于 2006-03-09 16:15:04 得分 0
Regex regstr3 = new Regex("<TEXTAREA.*?>(.*?)</TEXTAREA>",RegexOptions.Single);
这样改一下。
你后面写的我就不看了。。Top
8 楼jasonpower(新丁)回复于 2006-03-10 09:07:12 得分 0
min_jie(止戈) :谢谢,应该是RegexOptions.Singleline 吧?:)
试过了,还是不行。不过你提醒了我,我发现其他比如title正常,“也许”是因为title标签一对是在一行里的。而textarea标签不是在一行里的。于是我换为:("<TEXTAREA.*?>(.*?)</TEXTAREA>",RegexOptions.Multiline ),所谓多行模式(我也只是课根据字面理解),不过也还是不行!!!Top
9 楼min_jie(止戈)回复于 2006-03-10 09:13:32 得分 40
Regex regstr3 = new Regex("<TEXTAREA.*?>(.*?)</TEXTAREA>",RegexOptions.Singleline|RegexOptions.IgnoreCase);
再这样改改:单行模式(即把整段字符串当作一行),并且忽略大小写。Top
10 楼min_jie(止戈)回复于 2006-03-10 09:16:00 得分 0
if(mastr3.Success)
{
Txtly.Text += I.ToString() + ";" + mastr31.Value+ "\r\n";//为什么会出现mastr31?
}
else
{
Txtly.Text += I.ToString() + ";" + strstream + "\r\n";
}Top
11 楼jasonpower(新丁)回复于 2006-03-10 10:07:10 得分 0
谢谢!试过了,还是匹配不成功!
程序里Txtly.Text += I.ToString() + ";" + mastr31.Value+ "\r\n";
应该是mastr3.Value才对。因为完整的程序还要再过滤一次,我复制过来时为了简便起见,就舍弃了一部分,这个变量名没有看清楚。抱歉各位。
我理解的:在正则里“.”可以匹配任何一个字符,应该也包括换行吧?min_jie(止戈) 提示了RegexOptions.Singleline单行模式(即把整段字符串当作一行),应该也不成为问题的呀!可是随便换一个在一行里出现的标签,都是可以成功的!!
真是奇怪呀!Top
12 楼jasonpower(新丁)回复于 2006-03-10 10:54:40 得分 0
修正:在正则里“.”可以匹配任何一个字符,“除了换行哦!”
是不是RegexOptions.Singleline单行模式没有起到我们理解的(把整段字符串当作一行)作用呀????????Top
13 楼jasonpower(新丁)回复于 2006-03-10 11:20:38 得分 0
搞定了,("(<textarea\\s)(.*?)</textarea>",RegexOptions.Singleline|RegexOptions.IgnoreCase)
就是在,<textarea后面加个\\s,表示后面一定有个空格,(.*?)用来匹配中间的任意字符。
虽然运行成功了,但是我还是不明白为什么“<textarea\\s”可以,“<TEXTAREA.*?>”不可以?
在这里要多谢min_jie(止戈) ,分数立刻送上!!!!!Top
14 楼min_jie(止戈)回复于 2006-03-10 11:21:39 得分 0
那只能说明你的匹配不成功。。你可以调试看看。。匹配成功了没有?
Top




