本帖最后由 lwy0319 于 2014-3-22 00:16 编辑
大家好,求助一个正则表达式问题
前几天做了道题,从字符串中提取数字
本来可以通过拆分成字符数组再通过循环判断看看是否小于等于9大于等于0,来将数字提取出来
后来好奇之下查了下网上的答案
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class Test{
- public static void main(String[] args) {
- String a="I31love23next2343423java12";//输入原字符串
- String regEx="[^0-9]";//输入规则为:表示取非0-9之间的数字 的字符串 依然String类型
- Pattern p = Pattern.compile(regEx);//实例化Pattern类型,将之真正转换成代表着正则表达式规则的类
- Matcher m = p.matcher(a);//用实例化的P规则去验证a字符串
- System.out.println( m.replaceAll("").trim());//m.replaseAll("")将不满足规则的字符更换成""(空),并返回String类型的字符串
复制代码 因为之前没接触过正则表达式,然后API查到了关于Pattern类的构造方法中非数字的表达如下
字符类
[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](减去)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
然后试着把String regEx="[^0-9]";这句改成了String regEx="\D";发现不允许,而且根据后来找到说明说"\"本身也是需要转义的,所以改成String regEx="\\D";就对了,但是还是不明白为什么需要转义,而且看原例子String regEx="[^0-9]";中的[^0-9]只是出现在说明文字中不知道是用在API中的哪种规则来定义的?PS:原代码没注释,我补充了下自己的理解关于trim()我不太理解它在这里的必要性,因为之前操作所替换的内容是“”而非" "(空格),我试着去掉它,发现输出结果没区别,但是不知道这是否是有潜在的区别?或者说是一种良好的习惯?
|