求助一个正则表达式

liubangls 2011-10-18 11:05:22
环境:ASP.net
表达式:(?<=( )*)(?!Now)[^<]*
原字符串:
      What aspect of Mr. Zhang interests you most

问题:
为何匹配的是整个字符串,而不是What aspect of Mr. Zhang interests you most,"*"默认不是贪婪的么?请高手帮忙解释下。
...全文
215 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangwenquan123 2011-10-19
  • 打赏
  • 举报
回复
午休了,午休完后在来。
liubangls 2011-10-19
  • 打赏
  • 举报
回复
谢谢您的继续关注,我主要纠结于(?<=( )+),环视中的量词"*"和"+",为什么不是贪婪的。
比方说:a*b,如果匹配aaaaab,a*会一直匹配到最后一个a,这里的( )*,为什么不像a*一样,
可以匹配到最后一个“ ”呢?
比如:      You may compare your high school math teacher with Mr. Zhang.
我希望,该子表达式能够一直匹配到“You may compare your...”前面的位置,也就是最后一个 后面的位置。如果用{6}来限制是可以做到的,但是我觉得不太好。因为前面的空格格式未必都是6个。请指教:)

[Quote=引用 19 楼 huangwenquan123 的回复:]

额= =昨天有事忙,没在继续上csdn回复。上面不是有回答了吗?
lz是在纠结
(?<=(&nbsp;)+)和(?<=(&nbsp;)*)吗?
[/Quote]
huangwenquan123 2011-10-19
  • 打赏
  • 举报
回复
额= =昨天有事忙,没在继续上csdn回复。上面不是有回答了吗?
lz是在纠结
(?<=( )+)和(?<=( )*)吗?
首先正则总是单字符匹配的,也就是从第0个位置开始一个字符一个字符匹配
当在位置0的时候,正则(?<=( )*),这个的最小字符是0,因为匹配0次到多次。
所以0位置匹配成功了。控制权交出,继续执行下个表达式...接下去就不说了
而(?<=( )+)最小字符是4,因为是匹配1次到多次
当在0位置的时候匹配失败,到位置5,也就是;的时候匹配成功,
而(?<=exp)是个零宽断言,意思也就是前面是exp,而在5位置的时候匹配成功了,所以从5继续匹配
这样也就匹配第一 后的位置

如果还不明白的话你继续回复。我有上来在回帖。
liubangls 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 soonfei 的回复:]

引用 16 楼 liubangls 的回复:

有人知道吗?

因为(?<=(&nbsp;)*)这里面,给&nbsp;分组了。

分组的贪婪,应该就不是所有的了,就是最后捕获的那个。
[/Quote]
并非是这样的,我试过,如果是+,捕获的是第一个 后的位置。如果是*,捕获的是第一个 前面的位置。没有找到满意的答案,我结贴了。
诺维斯基 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 liubangls 的回复:]

有人知道吗?
[/Quote]
因为(?<=( )*)这里面,给 分组了。

分组的贪婪,应该就不是所有的了,就是最后捕获的那个。
liubangls 2011-10-19
  • 打赏
  • 举报
回复
非常感谢大侠的帮助,可惜已经结贴了,不能给你分了,抱歉。获益良多。有机会再向你学习。也感谢其他热心的网友的热情帮助。
[Quote=引用 27 楼 huangwenquan123 的回复:]

引用 25 楼 liubangls 的回复:
补充:
原字符串为:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Now you have 1 minute to prepare.&amp;nbsp;&amp;nbsp;&amp;nbsp;&……
[/Quote]
huangwenquan123 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 liubangls 的回复:]
补充:
原字符串为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Now you have 1 minute to prepare.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;What aspect of Mr. Zhang interests y……
[/Quote]
            string str = @"      Now you have 1 minute to prepare.      What aspect of Mr. Zhang interests you most?      You may compare your high school math teacher with Mr. Zhang.       Talk about three detailed facts to show their difference.";
Regex reg = new Regex(@"(?<= )(?!Now| ).+?(?= |$)");
foreach (Match m in reg.Matches(str))
Console.WriteLine(m.Value);
huangwenquan123 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 liubangls 的回复:]
我是不是可以理解为在逆序肯定环视里,(&nbsp;)*,不是贪婪模式?【你的代码中(?:&nbsp;)*,这里的*就是贪婪的,可以匹配连续的&nbsp;】另外,如果,我要排除后面的"Now you have 1 minute to prepare.",应该怎么写?

引用 23 楼 huangwenquan123 的回复:

引用 20 楼 liubangls 的回……
[/Quote]你不要管是不是贪婪的,因为任何字符串(?<=(...)*)来匹配这一个都会匹配成功。
你应该按着我上面写的那个理解,从位置0开始匹配,匹配0次或多次。
例如:
string str = "aaaaaaaaab";
Regex reg = new Regex(@"(?<=c*).*");
Console.WriteLine(reg.Match(str).Value);
这个匹配出来的为aaaaaaaaab
liubangls 2011-10-19
  • 打赏
  • 举报
回复
补充:
原字符串为:      Now you have 1 minute to prepare.      What aspect of Mr. Zhang interests you most?      You may compare your high school math teacher with Mr. Zhang.       Talk about three detailed facts to show their difference.
liubangls 2011-10-19
  • 打赏
  • 举报
回复
我是不是可以理解为在逆序肯定环视里,( )*,不是贪婪模式?【你的代码中(?: )*,这里的*就是贪婪的,可以匹配连续的 】另外,如果,我要排除后面的"Now you have 1 minute to prepare.",应该怎么写?
[Quote=引用 23 楼 huangwenquan123 的回复:]

引用 20 楼 liubangls 的回复:
我希望,该子表达式能够一直匹配到“You may compare your...”前面的位置,也就是最后一个&nbsp;后面的位置。如果用{6}来限制是可以做到的,但是我觉得不太好。因为前面的空格格式未必都是6个。请指教:)


C# code

string str = "&nbsp;&nb……
[/Quote]
huangwenquan123 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 liubangls 的回复:]
我希望,该子表达式能够一直匹配到“You may compare your...”前面的位置,也就是最后一个 后面的位置。如果用{6}来限制是可以做到的,但是我觉得不太好。因为前面的空格格式未必都是6个。请指教:)

[/Quote]

string str = "      You may compare your high school math teacher with Mr. Zhang.";
Regex reg = new Regex(@"(?: )*((?:(?! ).)+)");
Console.WriteLine("{0}\r\n{1}", reg.Match(str).Value, reg.Match(str).Groups[1].Value);
huangwenquan123 2011-10-19
  • 打赏
  • 举报
回复
先说
string str="aaaaab"
Regex reg = new Regex(@"a*b");
这个是普通的正则,也就是匹配0个或多个a和一个b
首先从0位置处开始匹配,匹配字符串a,匹配成功,一直匹配到b,也就是整个字符串
这个理解应该没问题吧?
而(?<=( )*)(?!Now)[^<]*这个表达式
先看(?<=( )*)逆序肯定环视,也可以理解为(?<=exp)exp2,exp2的前面为exp
而( )*为匹配0次或多次。
(?<=( )*)开始匹配,当在0的位置时,0位置的前面为什么都没有,也就是匹配( )*0次,
匹配成功,匹配成功(?<=( )*)这个就交出控制权,执行(?!Now)[^<]*
(?!Now)在位置1处匹配为不是Now的值,匹配成功,然后继续执行[^<]*。
匹配不是<的多个数,也匹配成功。
所以返回的是从0开始到结尾的字符串

明白了?
md5e 2011-10-18
  • 打赏
  • 举报
回复

string listIssue = "      What aspect of Mr. Zhang interests you most";
Regex re = new Regex(@"( )+(?<text>.*)", RegexOptions.IgnoreCase);
Match mc = re.Match(listIssue);

while (mc.Success)
{
Response.Write(mc.Groups["text"] + "<br/>");
mc = mc.NextMatch();
}
Response.End();
liuyilin888 2011-10-18
  • 打赏
  • 举报
回复
你知道什么叫贪婪吗?
越多越好!!!!
所以.........
诺维斯基 2011-10-18
  • 打赏
  • 举报
回复
一楼呢?
诺维斯基 2011-10-18
  • 打赏
  • 举报
回复
是贪婪的,后面加个"?"就变成非贪婪了。
诺维斯基 2011-10-18
  • 打赏
  • 举报
回复
是贪婪的,后面加个"?"就变成非贪婪了。
liubangls 2011-10-18
  • 打赏
  • 举报
回复
有人知道吗?
houhui870522 2011-10-18
  • 打赏
  • 举报
回复
这个不懂耶
liubangls 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 laowang134 的回复:]
C# code
using System;
using System.Net;
using System.Collections.Generic;
using System.Xml;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication13
{
cla……
[/Quote]

还有,我主要想知道:(?<=( )*)(?!Now)[^<]*,(?<=( )*)里面的*为何不是贪婪模式,麻烦解释一下。并不仅仅想要知道结果。谢谢
加载更多回复(8)

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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