求一个表示可有可无的正则表达式

dalisong 2009-03-10 12:50:29
第一种情况:
<td onmouseout="hide();"
onMouseOver="show('<table width=300 class=bg_top1 border=1><tr><td bgcolor=#FFFFFF >test</td></tr></table>');"
>
有变价
</td>

第二种情况:
上面下划线部分是可有可无的,就是说有上面这段html有时候会变成这样:
<td>567</td>


为了适应这两种情况,我写的正则如下:
@"<td[^""]*""*[^""]*""*[^""]*""*[^""]*""*[\s]*>[\s]*(?<Price>.+)[\s]*</td>"


当为第一种情况时可以正常取值,第二种情况<td>567</td>时就取不到,
说明[^""]*""*[^""]*""*[^""]*""*[^""]*""*这段正则不对,
请帮忙指正一下
...全文
2191 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkun_3yue3 2009-03-10
  • 打赏
  • 举报
回复
空军真专业~
wuyi8808 2009-03-10
  • 打赏
  • 举报
回复
@"(?six)           # 宽松排列格式
<td\s+ # 开始
(?: # 下述字符
""[^""]*"" # 双引号字符串
| # 或者是 ...
'[^']*' # 单引号字符串
| # 或者是 ...
[^""'>] # 除了双引号、单引号或结束的尖括号(>)外的其他文本
)* # 重复任意多次
> # 结束的尖括号(>)
.* # 内容
</td> # 结束
";
wuyi8808 2009-03-10
  • 打赏
  • 举报
回复
你那样之所以取不到 <ChangePrice>,是因为单引号在双引号内部,被双引号屏蔽了。

其实可以分两次取:

using System;
using System.Text.RegularExpressions;

class Program
{
static void Main()
{
string s = @"<td onMouseOver=""show('<table>');"">567 </td>";

string p1 = @"(?si)<td\b(?:""[^""]*""|'[^']*'|[^""'>])*>\s*(?<Price>.+?)\s*</td>";
Match m1 = Regex.Match(s, p1);
Console.WriteLine(m1.Groups["Price"]); // 输出: 567

string p2 = @"(?s)'(?<ChangePrice>.*?)'";
Match m2 = Regex.Match(s, p2);
Console.WriteLine(m2.Groups["ChangePrice"]); // 输出: <table>
}
}
dalisong 2009-03-10
  • 打赏
  • 举报
回复
自己顶,如何取出单引号中的值
dalisong 2009-03-10
  • 打赏
  • 举报
回复
下面这样写OK了,谢谢wuyi8808大侠,没想到还能这样用,学习了
@"<td(?:""[^""]*""|'[^']*'|[^""'>])*>\s*(?<Price>.+)\s*</td>"


但我现在想取出单引号中的内容,想当然的加了个<ChangePrice>,但取不了值,望再次指点啊:
@"<td(?:""[^""]*""|'(?<ChangePrice>[^']*)'|[^""'>])*>\s*(?<Price>.+)\s*</td>"
马老虎 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyi8808 的回复:]
C# code@"(?six) # (?s)=点号匹配一切字符,(?i)=不区分大小写,(?x)=宽松排列格式
<td\s+ # 开始
(?: # 下述字符
""[^""]*"" # 双引号字符串
| # 或者是 ...
'[^']*' # 单引号字符串
| # 或者是 ...
[^""'>] # 除了双引号、单引号或结束的尖括号(>)外的其他文本
)* # …
[/Quote]
wuyi8808 2009-03-10
  • 打赏
  • 举报
回复
@"(?six)           # (?s)=点号匹配一切字符,(?i)=不区分大小写,(?x)=宽松排列格式
<td\s+ # 开始
(?: # 下述字符
""[^""]*"" # 双引号字符串
| # 或者是 ...
'[^']*' # 单引号字符串
| # 或者是 ...
[^""'>] # 除了双引号、单引号或结束的尖括号(>)外的其他文本
)* # 重复任意多次
> # 结束的尖括号(>)
\s*
(?<Price>[\d\.]+) # 内容
\s*
</td> # 结束
";

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧