不知道 ? 为什么是贪婪!名字起的怪怪的,我这里用UML的角度解释下 ?就是 0或者1
+→[1,无穷]
*→[0,无穷]
?→[0,1]
*,+,? 都是贪婪模式 (单一的量词都是贪婪模式,单独的*,?,+,{})尽可能多的匹配
*?,+?,??都是懒惰模式
*+,++,?+ 这些叫占有优先量词 (占有优先要是理解不透彻就先别用了容易出问题,主要用于提高效率)
贪婪模式是尽可能多的匹配
懒惰模式是尽可能少的匹配,满足下限就行
占有优先是匹配的字符不会吐出来
例子:{
正则 :abc++1 目标字符串:absadfasdabcabc1
c+要求尽可能多的匹配c
先找到第一个abc,然后下一个字符是a,不是c所以c++匹配结束了,abc++1
但是之后要求有1
这时候发现a<>1,所以这次查找也失败了,正则开始从下一个位置查找,也就是bcabc1从b这开始b不是a,结束,cabc1c不是a,结束,abc1发现a了abc++1往下匹配abc都能对应上了,匹配结束
}
举个例子reg=.{1,3}+1
str=xy1y
.{1,3}这里.后面是量词,量词后面跟着+ 所以是占有优先
解释:.{1,3} 尽可能多的匹配,这样匹配了前三个字符xy1,而.{1,3}+后面还有个1
由于占有优先,因此不会吐出1,以至于匹配不到
插入下 正则 “回溯” 执行{
字符串: ab1c1 正则:.*1
.*会一直匹配到最后 .*1 找完.* 然后再找1 最后没有字符了(.一般不匹配\n,\r),不行,之前匹配的东西就得吐出来一个( 从右向左 反吐) 看看是不是1,直到找到1为止
例子 .*1 里的 .* 匹配 ab1cd1ef 的时候 会走到最后 ,然后 到 .*1 里的 1 ,这样就会先吐出 f 再吐出 e 再吐出 1 发现 可以,允许匹配,终止跳出 ,这里将不考虑ab后面的l了
}
回归占有优先正题:占有优先就是匹配了的字符不再吐出来,没有了回溯{
例子:字符串aabbccddccbb正则:bc++c
第一个b后面不是c,不行
第二个b后面可以bc(吃掉一个c)
于是这部分匹配了
bc+继续找c(吃掉一个c)
bcc匹配到这3个字符
现在bc++
后面还有一个加号
那就是说c+匹配的东西不会再还给你了
bc++c后面这个c,就找不到对应的c了
所以此次匹配失败
然后从aabb后面的c再开始按照规则查找
总结下:字符++字符(两个字符一样) 肯定是什么都匹配不到的
}
强制与非强制区别: 找到0个 也通过,?*都不是强制的
?和*,既然都可以取到,那正则在没有找到要匹配的元素的时候
那就令?=0,*=0就可以了,这样就能成功匹配了
----------------------------------
\b是单词开始结束的标记
abcd \babc 就是说 一个单词以abc开始 abc\b 就是说一个单词以abc结束
不在[]中,^表示开始
^和-,只有在[]里面放在最开始才有特殊含义,[^]表示非
-在开头的话,-就表示他自己 ,在中间才是特殊字符 比如 [a-z]
[]里面相当于| 或
http://gskinner.com/RegExr 测试
\b(\w+)\b(\s*\1)+ 匹配重复出现单词 asd asd aaa asd asd asd ddww ddww aaddweeas asd sd sd ee ee a a
\b(\w+)\b一个单词之后,后面会有空白断开
所以要\s,空白之后要求还是前面的单词,所以\1
多个就是在空白,再\1
String str=" asd asd aaa asd asd asd ddww ddww aaddweeas asd sd sd ee ee a a 啊 啊 啊";
Pattern pa = Pattern.compile("\\b(\\w+)\\b(\\s*\\1)+");
Matcher ma = pa.matcher(str);
while(ma.find()){
System.out.println(ma.group());
}
分享到:
相关推荐
6. **注意事项** - 正则表达式的设计需考虑网页结构的多样性,避免过于严格导致匹配失败。 - 网页编码问题,确保易语言程序与网页编码一致,避免乱码。 - 遵守网站的robots.txt协议,尊重网站的抓取限制,避免...
9. **注意事项** 调整正则化参数时需谨慎,过强的正则化可能导致欠拟合,而过弱的正则化可能导致过拟合。通常,通过交叉验证选择合适的λ值是最佳实践。 总结来说,Matlab正则化工具箱为用户提供了高效、灵活的...
进阶技巧与注意事项 1. **多次小数点问题:** 在实际应用中,还需要注意处理多个小数点的情况,通常一个数字中只能包含一个小数点。可以通过改进正则表达式来解决这个问题,例如: ```javascript onkeyup="this....
11. 学习注意事项: - 熟悉正则表达式的基础语法和常用元字符,是高效使用的关键。 - 在编写复杂正则时,可以利用在线正则表达式测试工具进行调试。 - 注意性能问题,过度复杂的正则可能导致性能下降。 - 不要...
- 注意事项:不同的引擎可能支持不同的特性,开发者在选择时需根据实际需求进行考量。 #### 五、进阶技巧 - **惰性量词**:允许用户指定最小匹配次数而非默认的最大匹配次数。这种机制在处理复杂文本时特别有用。...
#### 三、其他注意事项 - **版本兼容性**:本文档基于Python 2.4版本编写,需要注意不同版本之间的差异。 - **高效正则表达式**:本文没有涉及如何编写高效的正则表达式以及优化技巧,请参考其他教程获取相关信息。...
本文将详细介绍JavaScript中正则表达式的贪婪模式和非贪婪模式,包括它们的具体功能、使用方法和相关注意事项。 首先,让我们来看一段示例代码: ```javascript try{ var str="<p>abcdefg</p><p>abcdefghijkl...
**注意事项:** - **耐心学习:** 不要期望短时间内就能完全掌握所有细节。 - **多加练习:** 实践是检验真理的唯一标准。 #### 3. 基础语法介绍 **元字符(Metacharacters)** - **元字符举例:** - `.`:匹配...
#### 四、注意事项 - **测试**:正则表达式可以非常强大,但也可能变得复杂和难以理解。始终确保测试你的正则表达式以确保它们按预期工作。 - **性能考虑**:对于复杂的正则表达式,编译正则表达式可以提高性能。 -...
#### 五、注意事项 - 在使用正则表达式时,需要注意转义字符的正确使用,特别是在Java中需要双重转义的情况。 - 当需要匹配特定范围内的字符时,应确保使用正确的字符类和范围。 - 使用边界匹配器时,要注意其在多行...
8. **注意事项**:"MongoDB中的注意事项.docx"可能涵盖了一些最佳实践,如内存管理、数据安全、备份恢复、性能调优等方面的内容,以避免常见问题。 9. **安装与管理**:"MongoDB在Linux系统中的安装.docx"和...
### MATLAB神经网络学习总结 #### 一、神经网络基础与特性 ##### 小波神经网络的优势 - **小波神经网络**(Wavelet Neural Network, WNN)利用**完全正交的小波基函数**(如Radial Basis Function, RBF)作为激励...
本文档对PHP开发过程中的一些注意事项进行了细致的总结,内容包括代码优化、性能提升、编码习惯等方面,旨在为PHP开发人员提供实践指导和参考。 1. 关于HTML和PHP代码的嵌入:在编写PHP代码时,通常会将HTML与PHP...
### 实际应用中的注意事项 由于不同版本的Perl对递归引用的支持可能不同,当你在实际环境中部署代码时,需要确保你使用的Perl版本足够新,以避免潜在的问题。 在Linux系统中,可以使用`$^V`来检查当前Perl的版本号...
#### 六、注意事项 - 在实际应用中,应确保所使用的正则表达式正确无误,以免造成误匹配。 - 对于需要多次搜索的情况,考虑使用其他方法如`match()`或`exec()`等。 - 在处理复杂的字符串时,建议结合使用其他字符串...
#### 三、注意事项 - 使用 `()` 定义捕获组时,注意不要遗漏,否则无法正确提取所需内容。 - 调用 `m.group(index)` 时,`index` 应当与 `()` 对应,其中 `0` 表示整个匹配的字符串,`1` 表示第一个括号内的内容,...
注意事项 需要注意的是,在使用正则表达式字符串时需要注意转义字符的使用。同时,Swift 的操作符是不能定义在局部域中的,因为操作符是需要在全局范围内使用的。重载和自定义操作符存在很多风险,使用前请多问问...