Java 正则表达式

正则表达式, regex 或者 regexp

定义一个搜索模式

通过模式用来查找或替换字符串

一、为什么要使用正则表达式

String str="abcdeABCD12345~/@#$"
Str->ch
if(ch>='A'&&ch<='Z'){
bigCount++;
}else if(ch>='a'&&ch<='z'){
smallCount++;
}else if(ch>='0'&&ch<='9'){
numberCount++;
}else{
System.out.println("该字符"+ch+"非法");
}
\w

正则表达式功能

校验数据的有效性,如校验手机,邮箱

查找符合要求文本 ,比如查找符合字符

对文本进行切割,替换等操作

正则应用范围

文本查找

java (java.util.Reg)

python (爬虫)

C#

Linux

javaScript(重点)

二、正则元字符

一些特殊的单字符

一些空白符号

表示范围

表示量词

例子:

在IDEA里新建.txt按Ctrl+F搜索,选中Regex即用正则表达式检索

Java 正则表达式_第1张图片

特殊单字符

. 匹配任意字符(换行符除外)

\d 匹配任意数字 \D 匹配任意非数字

\w 匹配任意字母数字下划线 \W 匹配任意非字母数字下划线

\s 匹配任意空白符 \S 匹配任意非空白符

空白符

\r 匹配回车符

\n 匹配换行符

\t 匹配制表符

\f 匹配换页符 

范围

| 代表或:如ab|bc 代表或bc

[...] 代表多选一,括号中任一单个字符

[a-z] 匹配是任意小写字符 [A-Z] 匹配任意的大写字符[a-zA-Z]

[^....] 取反 [^a-z] 匹配是大写字符

量词

*含义:0到多次

coloru*r

-》 u出现0次 也可以出现多次

colouuuuuuuuuuuur

colour

color

 +含义:1到多次

coloru+r

-》

u出现1次 多次 但不能0次

colouuuuuuuuuuuur

colour

?含义:0到1次 

 colou?r

-》u 出现 0 次 1次

colour

color

{m}含义:出现m次

{m,}含义:出现至少m次

{m,n}含义:m到n次

a0{5} 匹配5个0字符

a0{4,}匹配至少4个0字符

a0{2,4} 匹配2~4个0的字符

-》

a0b

a00b

a000b

a0000b

a00000b

量词的贪婪模式和非贪婪模式和独占模式

贪婪模式 :默认采用贪婪模式,也就是尽可能多匹配

非贪婪模式:在表示数量元字符后加? ,找出长度最小的且满足要求字符

独占模式:

a*             --正则表达式

aaabb      --被查找的字符

01234      --每个字符的下标

叫贪婪模式:会先尝试尽量匹配更多的,尽量多匹配

a* 匹配开头a会尝试尽量匹配更多的a

-》

先匹配aaaa

再匹配aa

最后匹配a

a*?         --正则

aaabb      --查找字符

01234      --下标

叫非贪婪模式:会先尝试匹配最短的,尽量少匹配

a*? 会尝试匹配最短a

->

先匹配a

再匹配aa

最后匹配aaaa

开头结尾

^数据 开头

数据$ 结尾

三、规范

1.常见的转义字符

字母前面加上反斜线"\”来表示常见的那些不能显示的ASCII字符,称为转义字符。如\O,\t, \n等。 

 \a
响铃(BEL)
\b
退格(BS),将当前位置移到前—列
\f
换页(FF),将当前位置移到下页开头
\n
换行(LF),将当前位置移到下—行开头
\r
回车(CR),将当前位置移到本行开头
\t
水平制表(HT)(跳到下一个TAB位置)
\v
垂直制表(VT)
\\
代表一个反斜线字符"\'
\'
代表一个单引号(撇号)字符

\"
代表一个双引号字符
\0
空字符(NULL)
\ddd
1到3位八进制数所代表的任意字符
\xhh
1到2位十六进制所代表的任意字符

 2、正则表达式中的特殊字符

在表达式中有特殊意义,需要在它前面添加“\”才能当作普通文本字符来使用。
使用正则表达式regex匹配特殊字符(2种方法记忆):

方法1:首先加"\"匹配该特殊字符本身,然后在转义字符(即""\"))前加"\"

方法2︰在特殊字符前加"\\”(或者使用[]),特别的"\"需要使用"\\\"来匹配 

四、例题 

例子:查找符合 http;// htts:// ftp:// 网址 

(https?|ftp):\/\/

1. https或者ftp

2. http:// ftp://

3.https? 0次 1次 http:// 或者 https://

4.\/\/中\代表转义=//

(https?|ftp):\/\/

-》

http://www.baidu.com    ok

https://www.baidu.com    ok

ftp://www.baidu.com    ok

pop3://www.baidu.com    fail

 例子:查找符合身份证、

^\d{15}$|(^\d{18}$)|^\d{17}(\d|X|x)$         --正则表达式

分析:

^\d{15}$     -》   以数字为开头和结尾,长度15

|

^\d{18}$)    -》-》 以数字为开头和结尾,长度18

|

^\d{17}(\d|X|x)$    -》前面是17个数字开头,第18个是数字|X|x结尾

例子:手机号验证

第一位: 1

第二位: 3~9

第三到第十一位只要是数字就行

正则如下:

/^1[3-9]\d{9}$/\

中国电信号段133、153、173、177、180、181、189、191、193、199

中国联通号段130、131、132、155、156、166、175、176、185、186、166

中国移动号段134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、172、 178、182、183、184、187、188、198

 例子:邮箱验证

第一位: @

zhangshi------wolf

^([a-zA-Z]|[0-9])(\w|\-)+

第二位:

163/qq/.

[a-zA-Z0-9]+\

.com

第三位. 后面

^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$

 例子:用户名验证 用户名没有特殊字符4~8位字符串

 ^\w{4,8}$

^\w{4,8}\-*?$

admin

admin-

Admin_12

实例代码: 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExpTest {

    public static void main(String[] args) {
        //邮箱验证
        String str="[email protected]";
        System.out.println(isEmail(str));
        // 用户密码 以字母为开头,长度在6-18之间,只能包含字符,数字,下划线
        // 唐诗设计密码   两个黄丽鸣翠柳  春江水暖鸭先知
        String pass="twoBird11Green-Tree";
        String pass1="SpringRiver2_Duck";
        System.out.println(isPassWord(pass1));
    }

    private static boolean isEmail(String str) {
       String parren="^([a-zA-Z]|[0-9])(\\w|\\-)+@[a-zA-Z0-9]+\\.([a-zA-Z]{2,4})$";
       return match(parren,str);//
    }

    private static boolean isPassWord(String s) {
        String parren="^[a-zA-z]\\w{5,17}$";//(5,17]
        return match(parren,s);
    }

    private static boolean match(String parren, String str) {
        //正则规则parren对象
        Pattern pattern=Pattern.compile(parren);
        Matcher matcher=pattern.matcher(str);//str是否被正则验证成功
        // return true/falase
        return matcher.matches();
    }
}

五、补充知识

正则修饰符 正则表达式中常用的模式修正符有i、g、m、s、U、x、a、D、e 等。

它们之间可以组合搭配使用。

i 不区分(ignore)大小写;

例如: /abc/i 可以匹配 abc、aBC、Abc

g 全局(global)匹配

如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回

如果带g,则字符串从左到右,找到每个符合条件的都记录下来,知道字符串结尾位置

例如:

var str = 'aaaaaaaa'

var reg1 = /a/; str.match(reg1) // 结果为:["a", index: 0, input: "aaaaaaaa"]

var reg2 = /a/g; str.match(reg2) // 结果为:["a", "a", "a", "a", "a", "a", "a", "a"]

m 多(more)行匹配

若存在换行\n并且有开始^或结束$符的情况下,和g一起使用实现全局匹配,

因为存在换行时默认会把换行符作为一个字符任务匹配字符串是个单行,

g只匹配第一行,添加m之后实现多行,每个换行符之后就是开始

var str = "abcggab\nabcoab";

var preg1 = /^abc/gm; str.match(preg1) // 结果为:["abc", "abc"]

var preg2 = /ab$/gm; str.match(preg2) // 结果为:["ab", "ab"]

s 特殊字符圆点 . 中包含换行符

默认的圆点 . 是 匹配除换行符 \n 之外的任何单字符,加上s之后, . 中包含换行符

$str = "abggab\nacbs";

$preg = "/b./s";

preg_match_all($preg, $str,$matchs);

print_r($matchs);//Array ( [0] => Array ( [0] => bg [1] => b [2] => bs ) )

U 只匹配最近的一个字符串;不重复匹配;

$mode="/a(.*?)c/";

$preg="/a.*c/U";//这两个正则返回相同的值

$str="abcabbbcabbbbbc" ;

preg_match($mode,$str,$content); echo $content[0];//abc

preg_match($preg,$str,$content); echo $content[0];//abc

//修正符:x 将模式中的空白忽略;

//修正符:A 强制从目标字符串开头匹配;

//修正符:D 如果使用$限制结尾字符,则不允许结尾有换行;

//修正符:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;

你可能感兴趣的:(JavaSE课堂笔记,正则表达式,java,intellij-idea)