正则表达式区分大小写吗?比一般的编程速度快吗?我这个超链接引号写“还是”“ 本帖最后由 SCAUSCNU 于 2011-03-13 01:41:55 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、首先是双引号转义的问C#中字符串前有@的情况下,用""对"进行转义,没有@的情况下,用\"对"进行转义所以你找到的那个正则表达式,应该这样声明string test = "此正则表达式用于匹配源文件中类似于<a href=\"http://news.sohu.com\">搜狐新闻</a>的字符串";Regex reg = new Regex(@"<a\s+href\s*=\s*""?([^"" >]+)""?>(.+)</a>");MatchCollection mc = reg.Matches(test);foreach (Match m in mc){ richTextBox2.Text += m.Groups[1].Value + "\n"; richTextBox2.Text += m.Groups[2].Value + "\n";}/*-----输出------http://news.sohu.com搜狐新闻*/2、接下来是是否区分大小写的问题正则默认是区分大小写的,需要加(?i)模式忽略大小写string test = "但是像<A href=\"http://news.sohu.com\">搜狐新闻</A>这样的超链接是不是就判断不出来了?";Regex reg = new Regex(@"(?i)<a\s+href\s*=\s*""?([^"" >]+)""?>(.+)</a>");MatchCollection mc = reg.Matches(test);foreach (Match m in mc){ richTextBox2.Text += m.Groups[1].Value + "\n"; richTextBox2.Text += m.Groups[2].Value + "\n";}/*-----输出------http://news.sohu.com搜狐新闻*/3、这个正则表达式局限性很大,源字符串稍复杂一点就匹配不到了,改下string test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A><A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A><a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");MatchCollection mc = reg.Matches(test);foreach (Match m in mc){ richTextBox2.Text += m.Groups["url"].Value + "\n"; richTextBox2.Text += m.Groups["text"].Value + "\n";}/*-----输出------http://news.sohu.com/1.html搜狐新闻1http://news.csdn.net/2.html床上等你新闻2http://news.china.com/3.html天朝新闻3*/list里面查找是否含有字符串a,区分大小写应该是用contains快,不区分大小写视具体情况而定 1、在.net应用中,对字符串的处理推荐使用正则表达式,效率比字符串中先Index再Substring(Index,Length)高得多。2、若仅仅是查询某字符串中含有另一字符串,使用indexOf的效率比正则表达式相当,但是简单得多。注意,.net中的字符串类String是很奇怪的东西,他是一个引用类,但是又是很特殊的引用类,每得到新的字符串实际上都进行了一次hash算法,以及hash比较,在一定程度上浪费资源,而正则表达式的算法会省略很多这些步骤,所以还快些。比方说吧,你得到一个新的字符串,Mystr="abcdefg";.net会首先将这个字符串转换为一个hash值,然后在他内部维护的一个hash表中查找是否存在,若存在,则将这个字符串的地址传递给Mystr,若不存在,则在内存中创建string类实例,将"abcdefg"放入这个内存块,再将地址传递给Mystr。所以在.net中处理字符串的速度有点点慢,用正则表达式就会省很多这种步骤,在速度上会快得多。你试试split()函数和substring函数的效率就知道了。String.split()函数内部是引用正则表达式的Regex.split函数的,效率比Substring明显高得多。但仅仅是查找,则使用Index还略好。 我是想在一个泛型为list的很长的存储很多字符串里面查找,但是在csdn里面看到有的文章说正则表达式是编程的效率高,但是执行的效率低(我找找链接),谢谢楼上各位啦 Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");你这里应该是(?i)吧? 不大可能啊,我测试过的,凡是要取出字符串的操作,正则表达式都快得多,若仅仅只查询,可能字符串的一些函数速度会更快的,当然,正则表达式中不能有过多回溯,否则速度就慢了。我还是刚才那个例子,ABC|DEF|GHI 这个字符串,将DEF取出来,一种方法是用split,字符串的split引用了正则表达式的split,两者效率一致;另一种方法是正则表达式|(.{0,5}?)|;还有一种是Index("|")然后substring。这三种方法循环一百万次就可以看出谁效率高了。事实上正则表达式的效率远胜于字符串函数Substring。(第一种方法其实也是正则表达式)。以前我也听人家说过正则表达式效率不高,但是对于回溯少的正则表达式,其效率一定超过字符串函数。 (?i)是忽略大小写(?s)单行模式(?is)就是忽略大小写且单行模式 1、首先是双引号转义的问C#中字符串前有@的情况下,用""对"进行转义,没有@的情况下,用\"对"进行转义所以你找到的那个正则表达式,应该这样声明C# codestring test = "此正则表达式用于匹配源文件中类似于<a href=\"http://news.sohu.com\">搜狐新闻</a>的字符串";Regex reg = new Regex(@"<a\…… 查看泛型list里面是否包含某个字符串,应该不是很复杂吧 Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");请问你这个(?<url>[^'""\s>]+)怎么在表达式前面加上问号?\1,<url>,<text>是什么意思啊?text指前面的字符串吗?还有,你说有@两个引号表示一个,但是test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A>里面有两个引号,你写的表达式貌似只判断了一个或者没有??? 我测试过了,你第一个test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A>查不出来的 (?<name>expression) 命名捕获组\number 反向引用我博客里都有,详细的可以去我博客里看至于后面的那个两个双引号的问题,C#的基础问题,说了是转义,我真的没什么好解释的 就用你这个例子测试的string test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A><A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A><a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>"); 你按我的代码测试,并且输出也是取的m.Groups["url"].Value和m.Groups["text"].Value? 改成这样就对了(?is)<a[^>]*?href=(['""]{0,2})(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a> 如果test我这样赋值,你的source那一栏怎么放string test = "<A href=\"http://news.sohu.com/1.html\">搜狐新闻1</A>\r\n<A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A>\r\n<a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";你还是没搞明白什么是转义,先找本讲语言基础的书看下吧 asp.net 如何格式化代码 DrawLine 连接直线问题 shell扩展问题 关于访问SQL数据库的问题 ASP.NET访问网络盘的问题 ajax返回的错误值? 怎样调整分页显示数量在GridView中 各位大侠,这个错误怎么解决啊? Hurry up,Help me! 单击获得GridView选中行值的问题 在子页面中查找子页面本身控件,使用FindControl查找不到 请教关于asp.net的几个问题!(俩页面传值,正则,防注入) DropDownList 修改时如何取得值。
C#中字符串前有@的情况下,用""对"进行转义,没有@的情况下,用\"对"进行转义
所以你找到的那个正则表达式,应该这样声明string test = "此正则表达式用于匹配源文件中类似于<a href=\"http://news.sohu.com\">搜狐新闻</a>的字符串";
Regex reg = new Regex(@"<a\s+href\s*=\s*""?([^"" >]+)""?>(.+)</a>");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups[1].Value + "\n";
richTextBox2.Text += m.Groups[2].Value + "\n";
}
/*-----输出------
http://news.sohu.com
搜狐新闻
*/2、接下来是是否区分大小写的问题
正则默认是区分大小写的,需要加(?i)模式忽略大小写
string test = "但是像<A href=\"http://news.sohu.com\">搜狐新闻</A>这样的超链接是不是就判断不出来了?";
Regex reg = new Regex(@"(?i)<a\s+href\s*=\s*""?([^"" >]+)""?>(.+)</a>");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups[1].Value + "\n";
richTextBox2.Text += m.Groups[2].Value + "\n";
}
/*-----输出------
http://news.sohu.com
搜狐新闻
*/3、这个正则表达式局限性很大,源字符串稍复杂一点就匹配不到了,改下
string test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A>
<A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A>
<a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";
Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups["url"].Value + "\n";
richTextBox2.Text += m.Groups["text"].Value + "\n";
}
/*-----输出------
http://news.sohu.com/1.html
搜狐新闻1
http://news.csdn.net/2.html
床上等你新闻2
http://news.china.com/3.html
天朝新闻3
*/list里面查找是否含有字符串a,区分大小写应该是用contains快,不区分大小写视具体情况而定
2、若仅仅是查询某字符串中含有另一字符串,使用indexOf的效率比正则表达式相当,但是简单得多。注意,.net中的字符串类String是很奇怪的东西,他是一个引用类,但是又是很特殊的引用类,每得到新的字符串实际上都进行了一次hash算法,以及hash比较,在一定程度上浪费资源,而正则表达式的算法会省略很多这些步骤,所以还快些。比方说吧,你得到一个新的字符串,Mystr="abcdefg";
.net会首先将这个字符串转换为一个hash值,然后在他内部维护的一个hash表中查找是否存在,若存在,则将这个字符串的地址传递给Mystr,若不存在,则在内存中创建string类实例,将"abcdefg"放入这个内存块,再将地址传递给Mystr。所以在.net中处理字符串的速度有点点慢,用正则表达式就会省很多这种步骤,在速度上会快得多。你试试split()函数和substring函数的效率就知道了。String.split()函数内部是引用正则表达式的Regex.split函数的,效率比Substring明显高得多。但仅仅是查找,则使用Index还略好。
你这里应该是(?i)吧?
不大可能啊,我测试过的,凡是要取出字符串的操作,正则表达式都快得多,若仅仅只查询,可能字符串的一些函数速度会更快的,当然,正则表达式中不能有过多回溯,否则速度就慢了。我还是刚才那个例子,ABC|DEF|GHI 这个字符串,将DEF取出来,一种方法是用split,字符串的split引用了正则表达式的split,两者效率一致;另一种方法是正则表达式|(.{0,5}?)|;还有一种是Index("|")然后substring。这三种方法循环一百万次就可以看出谁效率高了。事实上正则表达式的效率远胜于字符串函数Substring。(第一种方法其实也是正则表达式)。以前我也听人家说过正则表达式效率不高,但是对于回溯少的正则表达式,其效率一定超过字符串函数。
(?s)单行模式
(?is)就是忽略大小写且单行模式
C#中字符串前有@的情况下,用""对"进行转义,没有@的情况下,用\"对"进行转义
所以你找到的那个正则表达式,应该这样声明
C# code
string test = "此正则表达式用于匹配源文件中类似于<a href=\"http://news.sohu.com\">搜狐新闻</a>的字符串";
Regex reg = new Regex(@"<a\……
Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");请问你这个(?<url>[^'""\s>]+)怎么在表达式前面加上问号?
\1,<url>,<text>是什么意思啊?text指前面的字符串吗?
还有,你说有@两个引号表示一个,但是test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A>里面有两个引号,你写的表达式貌似只判断了一个或者没有???
(?<name>expression) 命名捕获组
\number 反向引用
我博客里都有,详细的可以去我博客里看至于后面的那个两个双引号的问题,C#的基础问题,说了是转义,我真的没什么好解释的
<A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A>
<a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";
Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");
你按我的代码测试,并且输出也是取的m.Groups["url"].Value和m.Groups["text"].Value?
如果test我这样赋值,你的source那一栏怎么放
string test = "<A href=\"http://news.sohu.com/1.html\">搜狐新闻1</A>\r\n<A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A>\r\n<a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";你还是没搞明白什么是转义,先找本讲语言基础的书看下吧