求解:正则表达式提取数据

爱上穿马甲的妞 2010-05-31 06:37:44
\<SCRIPT\s+language=["']*javascript["']*\s+src=["']*(([a-zA-Z0-9_-]+)[.](js))["']*\>\</script\>
上面的正则是我简单的改写的能够匹配:
我怎么获取1111.js呢?也就是(([a-zA-Z0-9_-]+)[.](js))匹配的内容。怎么做呢?我从html中得到了<script language=javascript src=></script>
,怎么做可以得到(([a-zA-Z0-9_-]+)他匹配的内容。
...全文
142 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 linxy2002 的回复:]
C# code

string str = "<script language=javascript src=abcd.js></script>";

Regex regex = new Regex("<script\\s*language=['\"]?javascript['\"]?\\s*src=['\"]?(?<src>[^'\"\\s……
[/Quote]
你的不全,添加一下就好了。
string str = "<script language=javascript src=abcd.js></script>";

Regex regex = new Regex("<script\\s*language=['\"]?javascript['\"]?\\s*src=['\"]?(?<src>[^'\"\\s>]*)></script>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Match match = regex.Match(str);
if (match.Success)
{
for (int i = 0; i < match.Groups.Count; i++)
{
Console.WriteLine(match.Groups[i]);
}
}

  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lxcnn 的回复:]
这样?

C# code
Regex reg = new Regex(@"(?is)<script[^>]*?src=(['""]?)(?<src>[^'""\s>]+\.js)\1[^>]*>\s*</script>");


还是说一定要带language=javascript

C# code
Regex reg = new Regex(@"(?is)<script\s+……
[/Quote]这个是可以的,我也改写了,也能满足条件,但是,没有你写的好。
我看不懂你写的。你能把你写的解释一下吗?我看我理解的对不对。麻烦你了。
linxy2002 2010-06-01
  • 打赏
  • 举报
回复

string str = "<script language=javascript src=abcd.js></script>";

Regex regex = new Regex("<script\\s*language=['\"]?javascript['\"]?\\s*src=['\"]?(?<src>[^'\"\\s>]*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Match match = regex.Match(str);
if (match.Success)
{
for (int i = 0; i < match.Groups.Count; i++)
{
Console.WriteLine(match.Groups[i]);
}
}
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lxcnn 的回复:]
(?is)<script[^>]*?src=(['""]?)(?<src>[^'""\s>]+\.js)\1[^>]*>\s*</script>"

(?i) 表示忽略大小写
(?s) 单行模式,表示小数点“.”可以匹配任意字符
那些如<srcipt、src=之类的固定字符没什么好解释的
[^>]*? 不是“>”的任意字符,0个或任意多个,这里使用非贪婪模式,是因为<script与src……
[/Quote]
谢谢,我会记住的。
-过客- 2010-06-01
  • 打赏
  • 举报
回复
这样?
Regex reg = new Regex(@"(?is)<script[^>]*?src=(['""]?)(?<src>[^'""\s>]+\.js)\1[^>]*>\s*</script>");


还是说一定要带language=javascript
Regex reg = new Regex(@"(?is)<script\s+language=javascript[^>]*?src=(['""]?)(?<src>[^'""\s>]+\.js)\1[^>]*>\s*</script>");
  • 打赏
  • 举报
回复
要完全的匹配<script language=javascript src=></script>
这句话,你给的,不能做到完全,可以匹配很多。
-过客- 2010-06-01
  • 打赏
  • 举报
回复
(?is)<script[^>]*?src=(['""]?)(?<src>[^'""\s>]+\.js)\1[^>]*>\s*</script>"

(?i) 表示忽略大小写
(?s) 单行模式,表示小数点“.”可以匹配任意字符
那些如<srcipt、src=之类的固定字符没什么好解释的
[^>]*? 不是“>”的任意字符,0个或任意多个,这里使用非贪婪模式,是因为<script与src=之间的字符一般来说比较少,如果用贪婪模式匹配到“>”再进行回溯,效率比较低,所以使用了非贪婪模式
(['""]?)和后面的反向引用\1,作用是限制这里出现的标点配对出现,由于html语言要求并不严格,所以src=后面可以不加标点,也可以加“'”或“"”,这里是为了适配这三种可能情况的
(?<src>Expression) 命名捕获组,把表达式Expression匹配到的内容捕获到src组中,以备后面引用
[^'""\s>]和[^>] 排除型捕获组就不用解释了吧
  • 打赏
  • 举报
回复
嗯,是啊,开始就是根据别人写的改写的。
-过客- 2010-05-31
  • 打赏
  • 举报
回复
楼主的那个正则,取m.Groups[1].Value即可,不过楼主的正则还有可优化的空间

Regex reg = new Regex(@"(?is)<script[^>]*?src=(['""]?)(?<src>[^'""\s>]+\.js)\1[^>]*>");
MatchCollection mc = reg.Matches(yourStr);
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups["src"].Value;
}
  • 打赏
  • 举报
回复
晕啊。没有人回复,我直接用(([a-zA-Z0-9_-]+)[.](js))在匹配一次就好了。哭!

111,125

社区成员

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

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

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