Java正则表达式
来源:互联网 发布:淘宝网国际转运服务 编辑:程序博客网 时间:2024/05/17 21:04
一、概述
其实是用来操作字符串的一些规则。
好处:正则的出现,对字符串的复杂操作变得更为简单。
特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。符号的出现,简化了代码的书写。
弊端:符号的出现虽然简化了书写,但是却降低了阅读性。
其实更多是用正则解决字符串操作的问题。
组:用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。
只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。
(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。
二、常见操作
1,匹配:
其实用的就是String类中的matches方法。
String reg = "[1-9][0-9]{4,14}";
boolean b = qq.matches(reg);//将正则和字符串关联对字符串进行匹配。
示例:
class MatchesDemo{/*对QQ号码进行校验要求:5~15 0不能开头,只能是数字*///方式一,不用正则表达式public static void qqCheck_1(String qq){if (!qq.startsWith("0")){if (qq.length()>=5&&qq.length()<=15){try{Long l=Long.parseLong(qq);//利用封装基本数据类型出现非数字报异常的特点System.out.println(qq);}catch (NumberFormatException e){System.out.println("包含非法字符!");}}elseSystem.out.println("你输入的长度非法!");}elseSystem.out.println("没有0开头的号码,请重输!");}//方式二,用正则来实现public static void qqCheck_2(String qq){String regex="[1-9]\\d{4,14}";if (qq.matches(regex))//用String类中matches方法来匹配{System.out.println(qq);}elseSystem.out.println(qq+":是非法的号码!"); } /*匹配手机号段只有 13xxx 15xxx 18xxxx*/ public static void phoneCheck(String phone){String regex="1[358]\\d{9}";if (phone.matches(regex)){System.out.println(phone+":::is ok..");}elseSystem.out.println("手机号码输入有误!");} public static void main(String[] args) {String qq="125696";qqCheck_1(qq);//不用正则的方式qqCheck_2(qq);//用正则的方式 String phone="13345678910";phoneCheck(phone);//匹配手机号码是否正确}}
2,切割
其实用的就是String类中的split方法。
按叠词完成切割:为了让规则被重用,可将规则封装成一个组,用()完成。组的出现都有编号,从1开始。想要使用已有的组可通过\n(n就是组的编号)的形式来获取。
示例:
class SplitDemo { public static void main(String[] args) {String regex1="\\.";//按 .切String regex2=" +";//按空格切,可能有一个空格或者多个空格String regex3="(.)\\1+";//按照出现两次或者以上的叠词切String[] arr="192.168.1.62".split(regex1);//按 . 切print(arr); arr ="wo shi shui 545 21 3".split(regex2);//按空格切print(arr); arr="erkktyqqquizzzzzo".split(regex3);//按叠词切print(arr);} //遍历public static void print(String[] arr){for (String s : arr){System.out.println(s);}}}
3,替换
其实用的就是String类中的replaceAll();
对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。如以下案例:
class ReplaceDemo {public static void main(String[] args) {String regex1="\\d{5,}";//将字符串中数字替换成#String regex2="(.)\\1+";//将叠词替换为一个 String s1="erej569831217woshi2659810wosxs12356f";s1=s1.replaceAll(regex1,"#");//将字符串中的数字替换成# String s2="erkktyqqquizzzzzo";s2=s2.replaceAll(regex2,"$1");//将叠词替换为一个,其中$1表示符合组中一个字符 System.out.println("s1:"+s1);System.out.println("s2:"+s2);}}
4,获取:
1),先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);
2),通过Pattern对象获取Matcher对象。Pattern用于描述正则表达式,可以对正则表达式进行解析。而将规则操作字符串,需要从新封装到匹配器对象Matcher中。然后使用Matcher对象的方法来操作字符串。
如何获取匹配器对象通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。
3),使用Matcher对象中的方法即可对字符串进行各种正则操作。
示例:
import java .util.regex.*;class PatternDemo{public static void main(String[] args) {String s= "ming tian jiu yao fang jia le ,da jia。";String regex="\\b[a-z]{4}\\b";get(s,regex);}public static void get(String s,String regex){//将规则封装成对象。Pattern p=Pattern.compile(regex);//让正则对象和要作用的字符串相关联。获取匹配器对象。Matcher m=p.matcher(s); //System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。//只不过被String的方法封装后,用起来较为简单。但是功能却单一。 while(m.find())//find()方法是将规则作用到字符串上,并进行符合规则的子串查找。{System.out.println(m.group());//group()方法用于获取匹配后结果。System.out.println(m.start()+"...."+m.end());//start()和end()分别表示匹配字符的开始和结尾的索引}}}
三、常见规则
1、字符
x 字符 x
\\ 反斜线字符
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
2、字符类
[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](减去)
3、预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
4、边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
5、Greedy数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n次
X{n,} X,至少 n次
X{n,m} X,至少 n次,但是不超过 m 次
6、组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。在替换中常用$匹配组的内容。
- Java 正则表达式正则
- 【正则表达式】Java正则表达式
- 正则表达式 JAVA正则表达式
- 【Java】【正则表达式】正则表达式
- Java 正则表达式详解_正则表达式
- java正则表达式!正则表达式踩坑!!!
- 正则表达式工具类,正则表达式封装,Java正则表达式
- Java正则表达式详解
- Java正则表达式详解
- Java正则表达式详解
- Java正则表达式详解
- Java正则表达式详解
- java和正则表达式
- java正则表达式详解!
- Java正则表达式详解
- Java正则表达式详解
- Java正则表达式详解
- Java正则表达式详解
- Java EE - useBean异常
- C语言中的递归和迭代
- web服务器和Application服务器---20141224
- tiny6410按键驱动(三)---中断发
- Ping pong
- Java正则表达式
- 定点绕定轴旋转
- 实验四: 字符串和多维数组 实验
- suds文档
- 从头认识C—关于数组名
- 子龙山人
- hdu1026(bfs + priority_queue + 寻找路径)
- leetcode:Best Time to Buy and Sell Stock
- cocos2d-x3.2入门