java下面这个正则表达式为什么是这样匹配?
import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main { public static void main(String[] args) { Pattern p = Pattern.compile("(?<!c)a(\\d+)bd"); Matcher m = p.matcher("da12bka3434bdca4343bdca234bm"); while (m.find()) { System.out.println(m.group(1)); System.out.println(m.group(0)); } }}3434a3434bd第一:转义符号用错了。
第二:正则最后多了个空格。
首先,点前面不能有转义符\ ,如果有转义符点就只能匹配小数点了。
其次,点不能写在中括号内,如果写在中括号内,依然只能匹配小数点。
所以,你应该把转义符和中括号去掉,点就能匹配任意字符了。
完整的Java程序如下:
package day01;public class Test001 { public static void main(String[] args) { String regex="."; String str="w"; System.out.println(str.matches(regex)); }}运行结果:
true
第一个问题。
and|And\b\w+在你给的文本中只能匹配and,也就是说你的表达式只有前半部分生效了。原因有2:
第一,你的表达式有两部分,and和AND\b\w+引擎首先用第一部分去对目标文本检索,如果不成功才会用第二部分。而引擎在15-18的位置第一部分发现了and字符串,就报告成功了,忽略了第二部分的检索。
第二,你的表达式的第二部分在你的目标文本中是永远不会成功的。原因在于\b后需要匹配至少一个\w,而\b后是空格故\w匹配失败,第二部分整体失败。
第二个事儿:
??是勉强的,不错。可它表达的意思是:能不匹配就不匹配,不能不匹配我还是要匹配。
分析你的结果,wabe.是吧。
\w+拿下wabe
\W??首先放弃对.的匹配,对吧,控制权交给后面的$
$试图寻找文本结尾,可是它却找到了.是吧。。。怎么办呢?此时它对\W??说,你不是放弃了一次机会嘛,你用上吧,这样没准咱就成功了。\W??听了觉得有道理,于是控制权又回到它那,它把.拿下,然后$匹配到了文本结尾。
整体报告成功。
结论:无论是勉强的还是积极的,它们都是为全局服务的,当有人迫使它们使用机会(勉强)亦或是放弃得到(积极)时,它们会义无反顾。引擎一定要尝试所有的可能才会报告最终结果,明白吧。
中国那种编程语言最受公司欢迎
ava是一ava是一种由Netscape的Live发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器终端语言,比如Perl,遗留的速度问题。当时服务端需要对数据进行验证,由于网络速度相当缓慢,只有28.8kbps,验证步骤浪费的时间太多。于是Netscape的浏览器Navigator加入了Java...
PHP从入门到精通的图书1
书 名: PHP从入门到精通作 者:潘凯华同名出版社:清华大学出版社出版时间: 2008ISBN: 9787302179597开本: 16定价: 68.00 元 VD语音视频教学光盘22小时教学视频录像,全程语音讲解《PHP从入门到精通》实例源程序、相关素材《PHP从入门到精通》特色基础知识一核心技术一高级应用一项目实战268个应用实例,...
小孩取名
父母给孩子取名要考虑哪些因素 名不正则言不顺。宝宝呱呱附地,父母最关心的莫过于给孩子起个好名字。许多人为了给儿女取个好名字,绞尽脑汁,翻《辞海》,看唐诗,问朋友,有的甚至花钱请人取名,结果取的名字并不理想。命名,看上去容易,实际上是有一定难度的。两三个字的简单组合,里面却包含了许许多多的技巧和方法...
秘南舒志:[答案] 呃, 第一个问题. and|And\b\w+在你给的文本中只能匹配and,也就是说你的表达式只有前半部分生效了.原因有2: 第一,你的表达式有两部分,and和AND\b\w+引擎首先用第一部分去对目标文本检索,如果不成功才会用第二部分.而引擎在15-18的...
皋兰县18715776252: java下面这个正则表达式为什么是这样匹配? - ?
秘南舒志: 呃,第一个问题.and|And\b\w+在你给的文本中只能匹配and,也就是说你的表达式只有前半部分生效了.原因有2:第一,你的表达式有两部分,and和AND\b\w+引擎首先用第一部分去对目标文本检索,如果不成功才会用第二部分.而引擎在...
皋兰县18715776252: java 下面这个正则表达式为什么能匹配?能否给出一个匹配 以小写开头的单词 的正则表达式? - ?
秘南舒志: 行头和行尾也是一种单词边界,在正则中有^和$分别匹配行头和行尾的,所以这个虽然不像空格,逗号句号那样能看到,但它们是确实存在的边界 你的正则表达式就能匹配小写开头的单词啊
皋兰县18715776252: 正则表达式 !\\^\\.\\*\\$!([^!]+)! 是什么意思 - ?
秘南舒志: 在java中要进行转义,所以转化成标准正则表达式后就是“ !\^\.\*\$!([^!]+)!” 正则表达式中\^ 表示就是^的本身的意思,\. \$ ,同理得知;所以最后你的表达式表示!^.$! 开头后面跟任意非!的字符串重复一次到无穷次,然后以!结束.例如:1321312!^.$! 123!123123. 如果想让字符串只能是!^.$! 123! ,两边没有其他字符的, 那么在你正则的首加上^尾加上$.
皋兰县18715776252: 这个正则表达式为什么是正确的?
秘南舒志:两个的目的不一样,为什么要用一样的正则表达式? 照你这意思,那还不如直接用 .* 匹配算了,其它表达式都是多此一举. 后面的\\d{4}.只是更精确的查找想要的数据, 能匹配的,只有符合这种格式:任意多个字符 4个数字 一个任意字符. 虽然两个正则表达式都能匹配aaa 8888c,但是,前者的结果包含后者,这只是两种结果的交集,你可以测试多个字符串,再看看结果. 比如,有一个人员信息表,我要查姓刘的,且为3个字的名字,总不可能用 .* 来匹配吧?那不是把表里的所有人员信息查出来了吗?不符合要求.
皋兰县18715776252: java正则表达式为什么返回false - ?
秘南舒志: 因为String类的matches函数要求从头到尾全匹配,才会返回true.如果你去掉字符串a的@前面的所有字符,String a="@地方撒饭 空间的说法 ";再匹配你的正则表达式就会返回true了.
皋兰县18715776252: java正则表达式是什么? - ?
秘南舒志: /(\d){3}/: \d:表示数字 {3}表示3个\d,也就是三个数字连着,这个正则表达式可以筛选出三个连续的数字出来,正则表达式很高效
皋兰县18715776252: java正则表达式是什么情况 - ?
秘南舒志: Sun的Java JDK 1.40版本包含了java.util.regex(一个完全开放、自带的正则表达式包),开始支持正则表达式,下面是他的部分语法 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明:"^The": 开头一定要有"The"字符串...
皋兰县18715776252: java正则表达式 - ?
秘南舒志: ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明: "^The": 开头一定要有"The"字符串; "of despair$": 结尾一定要有"of despair" 的字符串; 那么, "^abc$": 就是要求以abc开头和以abc结尾的字符串,实际...
皋兰县18715776252: java 中正则表达式是什么意思???(regular Expression). - ?
秘南舒志: 一套处理java字符串的API,用于在目标字符串查找符合特定规则的字串.相关的处理类Pattern,Matcher.一个例子: public static void main(String args[]){//检测字符串是否符合全是数字的规则.Pattern p=Pattern.compile("[0-9]+");String src=...