正则表达式
发布时间:2020-12-13 23:06:52 所属栏目:百科 来源:网络整理
导读:问题: 1.如果我的需求是按照""来切,至少有一个,怎么写正则表达式?? 2.Greedy 数量词 Reluctant 数量词 Possessive 数量词这三个数量词都表示什么意思?? public static void main(String[] args) { split("c:\puba.txt\abcdefg","");/
问题: 1.如果我的需求是按照""来切,至少有一个,怎么写正则表达式?? public static void main(String[] args) { split("c:\puba.txt\abcdefg","");//如果我的需求是按照""来切,至少有一个,怎么写正则表达式?? //"\+"可以完美解决问题,但是和"+"之间的区别是什么呢? } public static String[] split(String s,String regex){ String[] arr= s.split(regex); for(String str :arr){ System.out.println(str); } return arr; }//“”反斜杠如果是单数,也许会报错, //因为一些字符没有转义字符,如:“p” //“”代表转移字符“” 查看String.java源码,可看到split可接收的字符串必须满足以下两个要求: 1、当接收的字符串长度为1,要保证它不是“。$|()[{^?*+”其中任一字符;""长度为1,且为特殊字符一员, 那么如果正则写成“”就会报错了,但是+是不会报错的 2、当接收的字符串长度为2时,字符串第一位字符是反斜杠,但第二位字符不能是ASCII格式的数字或字母;"\"长度为2,且第二位字符是'',故能正常切割。 String.java源码中split相关部分内容: public String[] split(String regex) { return split(regex,0); } public String[] split(String regex,int limit) { /* fastpath if the regex is a (1)one-char String and this character is not one of the RegEx's meta characters ".$|()[{^?*+",or (2)two-char String and the first char is the backslash and the second is not the ascii digit or ascii letter.java中的正则位于java.util.regex包中,这个包中只有一个MatchResult接口和Matcher、Pattern两个类。正则中的数量词有Greedy (贪婪)、Reluctant(懒惰)和 Possessive(强占)三种: Greedy 数量词 X?X,一次或一次也没有 X*X,零次或多次 X+X,一次或多次 X{n}X,恰好 n 次 X{n,}X,至少 n 次 X{n,m}X,至少 n 次,但是不超过 m 次 Greedy是最常用的,它的匹配方式是先把整个字符串吞下,然后匹配整个字符串,如果不匹配,就从右端吐出一个字符,再进行匹配,直到找到匹配或把整个字符串吐完为止。 [java] view plaincopy Matcher m=Pattern.compile("a.*b") .matcher("a====b=========b====="); while(m.find()){ System.out.println(m.group()); } 输出: a====b=========b 因为总是从最大 匹配开始匹配,故称贪婪。 Reluctant 数量词 X??X,一次或一次也没有 X*?X,零次或多次 X+?X,一次或多次 X{n}?X,恰好 n 次 X{n,}?X,至少 n 次 X{n,m}?X,至少 n 次,但是不超过 m 次 Reluctant正好和Greedy相反,它先从最小匹配开始,先从左端吞入一个字符,然后进行匹配,若不匹配就再吞入一个字符,直到找到匹配或将整个字符串吞入为止。 [java] view plaincopy Matcher m=Pattern.compile("a.*?b") .matcher("a====b=========b====="); while(m.find()){ System.out.println(m.group()); } 输出: a====b 因为总是从最小匹配开始,故称懒惰。 Possessive 数量词 X?+X,一次或一次也没有 X*+X,零次或多次 X++X,一次或多次 X{n}+X,恰好 n 次 X{n,}+X,至少 n 次 X{n,m}+X,至少 n 次,但是不超过 m 次 Possessive和Greedy的匹配方式一样,先把整个字符串吞下,然后匹配整个字符串,如果匹配,就认为匹配,如果不匹配,就认为整个字符串不匹配,它不会从右端吐出一个字符串再进行匹配,只进行一次 [java] view plaincopy Matcher m=Pattern.compile("a.*+b") .matcher("a====b=========b====="); while(m.find()){ System.out.println(m.group()); } 输出: 因为贪婪但并不聪明,故称强占。正则表达式: 好处:正则的出现,对字符串的复杂操作变得更为简单。 特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。符号的出现,简化了代码的书写。 弊端:符号的出现虽然简化了书写,但是却降低了阅读性。 其实更多是用正则解决字符串操作的问题。 组:用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。 只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加。 (aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。 常见操作: 1,匹配:其实用的就是String类中的matches方法。 String reg ="[1-9][0-9]{4,14}"; boolean b = qq.matches(reg);//将正则和字符串关联对字符串进行匹配。 2,切割:其实用的就是String类中的split方法。 3,替换:其实用的就是String类中的replaceAll(); 4,获取: 1),先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex); 2),通过Pattern对象获取Matcher对象。 Pattern用于描述正则表达式,可以对正则表达式进行解析。 而将规则操作字符串,需要从新封装到匹配器对象Matcher中。 然后使用Matcher对象的方法来操作字符串。 如何获取匹配器对象呢? 通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。 3),使用Matcher对象中的方法即可对字符串进行各种正则操作。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |