正则表达式, 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即用正则表达式检索
coloru*r
-》 u出现0次 也可以出现多次
colouuuuuuuuuuuur
colour
color
coloru+r
-》
u出现1次 多次 但不能0次
colouuuuuuuuuuuur
colour
colou?r
-》u 出现 0 次 1次
colour
color
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
字母前面加上反斜线"\”来表示常见的那些不能显示的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位十六进制所代表的任意字符
在表达式中有特殊意义,需要在它前面添加“\”才能当作普通文本字符来使用。
使用正则表达式regex匹配特殊字符(2种方法记忆):
方法1:首先加"\"匹配该特殊字符本身,然后在转义字符(即""\"))前加"\"
方法2︰在特殊字符前加"\\”(或者使用[]),特别的"\"需要使用"\\\"来匹配
(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})$
^\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()使用, 可以把匹配来的字符串当作正则表达式执行;