前几天搞明白了Javascript中的正则表达式(当然,写的水平还是很不咋地),于是想把系统中的java代码中的比较累赘的搜索、替换的代码,用正则表达式替换掉。
没想到java的正则表达式和javascript的应该是相差很大的。
之前的代码中,我只用过String.split("[|]");
根据javaAPI的正则表达式的例子 Pattern p = Pattern.compile("a*b"); //1
Matcher m = p.matcher("aaaaab");
System.out.println(m.matches());结果是:true。但把第1行的“a*b”改为“ab”或者“a”,都会显示false。然后,加上“[]”或者“/”都不对。我就想不明白,"a*b"是正则表达式,怎么"ab"或者"a",就不是正则表达式了呢?split()用的是正则表达式,Pattern.compile()也是用正则表达式,为何写法不一样?应该如何写法?
没想到java的正则表达式和javascript的应该是相差很大的。
之前的代码中,我只用过String.split("[|]");
根据javaAPI的正则表达式的例子 Pattern p = Pattern.compile("a*b"); //1
Matcher m = p.matcher("aaaaab");
System.out.println(m.matches());结果是:true。但把第1行的“a*b”改为“ab”或者“a”,都会显示false。然后,加上“[]”或者“/”都不对。我就想不明白,"a*b"是正则表达式,怎么"ab"或者"a",就不是正则表达式了呢?split()用的是正则表达式,Pattern.compile()也是用正则表达式,为何写法不一样?应该如何写法?
解决方案 »
- 请问怎么设置JOptionPane的位置啊?
- 怎么样才能读到一个目录下面所有的文件?
- 关于 JDK1.3.1_08\j2sdk-1_3_1_08-solaris-sparc.sh
- java怎样连接ACCESS数据库
- 关于在图形上写文字的问题,急!在线等待
- 想研究一下,对JXTA有了解的进来谈谈!欢迎讨论,提供资料!!
- 我想调用图片的单击事件,再用函数动态加载图片,这样为什么不能实现???
- java用swing插件把数据库中的数据表示出来
- ConcurrentLinkedQueue 源码阅读的疑问,offer方法里面compareAndSwapObject表现奇怪
- 求大佬指点!!我的代码错在哪里
- Java socket 问题
- 关于正则表达式的问题
打开路径:java/util/regex/Pattern.html#sum
或者,按如下次序打开API,
String;
String.matches();在String.matches();描述中有一个[正则表达式]的链接,可以看到正则表达式的详细文档。
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
e.g:
把第1行的“a*b”改为“ab”:匹配ab但前面的aa就不能匹配了;
“a*b”改为“a”:匹配a但ab就不能匹配了 、
以下修改都包含不满足成分,
例如写在split()方法里面,是用"[|]"(用|作为分隔符),而写到compile()却是"a*b",没有了方括号“[]”了。而且,在compile()方法中,用"a",却不能在“aaaaab ”找到a出来,那么我在什么地方写错了呢?应该怎么写呢?
Attempts to match the entire region against the pattern.
上面是matches方法的说明,意思是查看你的pattern是否匹配整个字符串...ab或者a当让不能匹配整个的aaaaabPattern p = Pattern.compile("ab"); //1
Matcher m = p.matcher("aaaaab");
while(m.find()) {
System.out.println(m.group());
}lz应该是用pattern去搜索字符串,查看有无匹配,应该使用find()把这个pattern驱动起来
正则获取固定email地址:http://blog.csdn.net/sxhs1986/archive/2011/04/27/6365779.aspx
使用正则把单数变小写,双数变大写!:http://blog.csdn.net/sxhs1986/archive/2011/04/27/6365781.aspx
使用正则统计项目代码量程序! :http://blog.csdn.net/sxhs1986/archive/2011/04/27/6365780.aspx
我自己最近也在研究。你把方法多研究下。再找几个例子。
还有java的转义加2个斜杠
写了几个测试例子,又发现问题。在JAVASCRIPT里面,有个/g和/i开关,/g在java中,被replaceAll方法解决了,但/i在java中,怎么写呢?
例如,我想替代所有的Exec/eXec/exec等等为exec(相信大家都明白我想做的事情,就是防止注入式攻击),用replaceAll应该怎么写呢?
谢谢。
test=test1.replaceAll("(?i)exec", "");
//方法一 使用表达式 "(?i)exec"
String test2 = "Exec/eXec/exec";
Matcher m = Pattern.compile("exec", Pattern.CASE_INSENSITIVE).matcher(test2);
if (m.find()) test2 = m.replaceAll("");
//方法二 Pattern.compile("exec",Pattern.CASE_INSENSITIVE)
你说的正则表达式文档,我也看过,而且从头到尾看过几次,只看到用compile()方法中的flags标识,有CASE_INSENSITIVE选项,里面还说道可以用?i来进行不区分大小写的匹配。原文是:“通过嵌入式标志表达式 (?i) 也可以启用不区分大小写的匹配。”
问题是:怎么用到replaceAll()里面呢?不经过Pattern类,简单很多的啊!!!
我要的就是第一种方法,我用了几个写法,例如exec?i、[exec]?i等等,都不行。原来是(?i)exec。
再次谢谢各位。