\b(\s+)://(\s+)(?::(\s+))?\b“?:”有什么用?
解决方案 »
- treeview在拖拽节点前能否实现不选中拖拽的节点?
- 哪位大哥帮帮忙,在线等!
- c#导出execl设置格式
- 关于XML操作的问题。
- 求解Microsoft.Office.Interop.Excel.Application引用问题
- 两个特简单的数据库问题
- 怎樣把SQL中Image字段數據直接顯示在頁面上呀!好急呀!都快一個月了!!!
- c#项目打完包,安装时提示要装microsoft visual j# .net 可在发行组件包-1.1.4322.
- 线程的暂停与重新启动
- notepad能打开为什么其它就打不开呢?在线等
- 取当前类的调用类
- 在asp.net中 怎样取得FileUpload文件的完整路径
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
举个例子:
字符串:testa
正则为:.*?(?=test)testa.*?(?=test)表示查找第一个test,匹配到了test,但是并没有获取test(如果获取了,就只留下a了),留给下面的继续匹配,所以testa才能匹配成功
匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“或”字符 (|) 组合模式部件的情况很有用。例如,与“industry|industries”相比,“industr(?:y| ies)”是一个更加经济的表达式。 什么叫——匹配但不捕获?
是不是搞错了啊(?=test)是匹配test前面的,但是不包含test的,感觉前面加个.*?没意义啊,前面已经都匹配了后面在断言感觉没意义啊,个人看法
正如你所说,test如果获取了,怎么就会只留下a了呢? 既然是为了匹配testa,那就直接.*?testa就行了,为什么还要加一个(?=test)呢?
那么匹配过程是这样的,逐次匹配,当捕获bctest的时候,遇到test这个字符了,那么不捕获test,只提取bc,剩下的还没有匹配的字符串则为:testa,继续执行正则。
所谓的捕获 是可以用Match.Groups取到的 没捕获一个就会在内存中开一片地方存上
而不捕获的 是可以用Match.Groups取不到的 他并没有单独的保存到内存上
1、(?:Expression)进行子表达式Expression的匹配,并将匹配内容保存到最终的整个表达式的区配结果中,但Expression匹配的内容不单独保存到一个组内
2、(?=Expression)顺序肯定环视,表示所在位置右侧能够匹配Expression,实际的匹配结果仅仅是一个缝隙
过客:http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Flxcnn
非捕获组(?:) 将匹配的内容不捕获到组中
零度断言(?=)(?!)(?<=)(?!=) 不消耗字符string input = "no something is nothing";
string pattern1 = "[a-z]+thing";
MatchCollection mc = Regex.Matches(input, pattern1);
foreach(Match m in mc)
{
Console.WriteLine(m.Value);
}
/*
something
nothing
*/
这里虽然thing也包含在结果中,但这里是匹配,不是捕获
string input = "no something is nothing";
string pattern2 = "[a-z]+(thing)";
MatchCollection mc = Regex.Matches(input, pattern2);
foreach(Match m in mc)
{
Console.WriteLine(m.Value);
Console.WriteLine(m.Groups[1].Value);
}
/*
something
thing
nothing
thing
*/
这里虽然thing包含在结果中,但这里是捕获,因为在捕获组中。
string input = "no something is nothing";
string pattern3 = "[a-z]+(?:thing)";
MatchCollection mc = Regex.Matches(input, pattern3);
foreach(Match m in mc)
{
Console.WriteLine(m.Value);//m.value和其他的是一样的
Console.WriteLine(m.Groups[1].Value);//这里会出错, 因为没有捕获组
}string input = "no something is nothing";
string pattern2 = "[a-z]+(?=thing)";
MatchCollection mc = Regex.Matches(input, pattern2);
foreach(Match m in mc)
{
Console.WriteLine(m.Value);
}
/*
some
no
*/
这里虽然thing不包含在结果中,这里不是捕获,是零度断言。
理解1:也就是说()是针对Matches而言的,在()中的取走另存为一个对象,不在()中的不另存。
理解2:断言就好比“非运算”,取()中匹配的“反”。
理解3:“?:”只是校验是否匹配,好比“if”控制语句,如果匹配继续校验直到被捕获,如果不匹配,就直接跳过或返回false。
以上3种理解,对么?
string input = "no something is nothing";
string pattern1 = "[a-z]+thing";
MatchCollection mc = Regex.Matches(input, pattern1);
foreach(Match m in mc)
{
Console.WriteLine(m.Value);
}