正则表达

正则表达式

正则表达式:其实一种规则,有自己特殊的应用,其作用就是针对于字符串进行操作。

正则:就是用于操作字符串的规则,其中这些规则使用了一些字符表示。

1.1 快速体验正则表达式

需求:只能输入数字


public class Demo2{

public static void main(String[] args) {

//只能输入数字

String str = "124354232";

char[] arr = str.toCharArray();

boolean flag = true;

for(int i = 0 ;  i< arr.length ; i++){

if(!(arr[i]>=48&&arr[i]<=57)){

flag = false;

}

}

System.out.println(flag?"输入正确":"输出只能是数字");

}

}

使用正则表达式:


public class Demo2{

public static void main(String[] args) {

//只能输入数字

String str = "12435423a2";

boolean flag = str.matches("[0-9]+");

System.out.println(flag?"输入正确":"只能输入数字");

}

}

1.2 正则表达式的符号

预定义字符类


.


任何字符(与行结束符可能匹配也可能不匹配)

 

\d


数字:[0-9]

 

\D


非数字: [^0-9]

 

\s


空白字符:[ \t\n\x0B\f\r]

 

\S


非空白字符:[^\s]

 

\w


单词字符:[a-zA-Z_0-9]

 

\W


非单词字符:[^\w]

 

System.out.println("a".matches("."));

System.out.println("1".matches("\\d"));

System.out.println("%".matches("\\D"));

System.out.println("\r".matches("\\s"));

System.out.println("^".matches("\\S"));

System.out.println("a".matches("\\w"));

Greedy 数量词


X?


X,一次或一次也没有


X*


X,零次或多次


X+


X,一次或多次


X{n}


X,恰好n次


X{n,}


X,至少n次


X{n,m}


X,至少n次,但是不超过m次


System.out.println( "a".matches(".") );

System.out.println( "a".matches("a") );

System.out.println("a".matches("a?") );

System.out.println( "aaa".matches("a*") );

System.out.println( "".matches("a+") );

System.out.println( "aaaaa".matches("a{5}") );

System.out.println( "aaaaaaaaa".matches("a{5,8}") );

System.out.println( "aaa".matches("a{5,}") );

System.out.println( "aaaaab".matches("a{5,}") );

范围表示


[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](减去)


System.out.println( "a".matches("[a]") );

System.out.println( "aa".matches("[a]+") );

System.out.println( "abc".matches("[abc]{3,}") );

System.out.println( "abc".matches("[abc]+") );

System.out.println( "dshfshfu1".matches("[^abc]+") );

System.out.println( "abcdsaA".matches("[a-z]{5,}") );

System.out.println( "abcdsaA12".matches("[a-zA-Z]{5,}") );

System.out.println( "abcdsaA12".matches("[a-zA-Z0-9]{5,}") );

System.out.println( "abdxyz".matches("[a-c[x-z]]+"));

System.out.println( "bcbcbc".matches("[a-z&&[b-c]]{5,}"));

System.out.println( "tretrt".matches("[a-z&&[^b-c]]{5,}"));

1.3 匹配功能

需求:校验QQ号,要求:必须是5~15位数字,0不能开头。没有正则表达式之前


public static void checkQQ(String qq)

{

int len = qq.length();

if(len>=5 && len <=15)

{

if(!qq.startsWith("0"))

{

try

{

long l = Long.parseLong(qq);

System.out.println("qq:"+l);

}

catch (NumberFormatException e)

{

System.out.println("出现非法字符");

}

}

else

System.out.println("不可以0开头");

}

else

System.out.println("QQ号长度错误");

}

有了正则表达式之后:

[1-9][0-9]{4,14}   [1-9]表示是第一位数字是会出现1-9范围之间的其中一个,下来的数字范围会出现在0-9之间,至少出现4次,最多出现14次。


public static void checkQQ2()

{

String qq = "12345";

String reg = "[1-9][0-9]{4,14}";

boolean b = qq.matches(reg);

System.out.println("b="+b);

}

需求:匹配是否为一个合法的手机号码。


public static void checkTel()

{

String tel = "25800001111";

String reg = "1[35]\\d{9}";//在字符串中,定义正则出现\ 要一对出现。

boolean b= tel.matches(reg);

System.out.println(tel+":"+b);

}

1.4 切割功能

需求1:根据空格对一段字符串进行切割。


public static void splitDemo()

{

String str = "aa.bb.cc";

str = "-1     99    4    23";

String[] arr = str.split(" +");

for(String s : arr)

{

System.out.println(s);

}

}

需求2 :根据重叠词进行切割。


public static void splitDemo2()

{

String str = "sdqqfgkkkhjppppkl";

String[] arr = str.split("(.)\\1+");

for(String s : arr)

{

System.out.println(s);

}

}

注意:为了提高规则复用,用()进行封装,每一个括号都有一个编号,从1开始,为了复用这个规则。可以通过编号来完成该规则的调用。需要对编号数字进行转义。\\1就代表获取1组规则。

1.5 替换功能

需求:把手机号替换成“*”号。


String str = "联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119";

String reg= "1[34578]\\d{9}";

str = str.replaceAll(reg,"******");

System.out.println("替换后的帖子:"+ str);

练习二:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程

将字符串还原成  我要学编程。

1.6 获取

获取需要使用到正则的两个对象:使用的是用正则对象Pattern 和匹配器Matcher。

用法:

范例:

Pattern p = Pattern.compile("a*b");

Matcher m = p.matcher("aaaaab");

boolean b = m.matches();

步骤:

1,先将正则表达式编译成正则对象。使用的是Pattern类一个静态的方法。compile(regex);

2,让正则对象和要操作的字符串相关联,通过matcher方法完成,并返回匹配器对象。

3,通过匹配器对象的方法将正则模式作用到字符串上对字符串进行针对性的功能操作

需求:获取由3个字母组成的单词。


public static void getDemo()

{

String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!";

//想要获取由3个字母组成的单词。

//刚才的功能返回的都是一个结果,只有split返回的是数组,但是它是把规则作为分隔符,不会获取符合规则的内容。

//这时我们要用到一些正则对象。

String reg = "\\b[a-z]{3}\\b";

Pattern p = Pattern.compile(reg);

Matcher m = p.matcher(str);

while(m.find())

{

System.out.println(m.start()+"...."+m.end());

System.out.println("sub:"+str.substring(m.start(),m.end()));

System.out.println(m.group());

}

// System.out.println(m.find());//将规则对字符串进行匹配查找。

// System.out.println(m.find());//将规则对字符串进行匹配查找。

// System.out.println(m.group());//在使用group方法之前,必须要先找,找到了才可以取。

}

练习3:校验邮件


public static void checkMail()

{

String mail = "[email protected]";

mail = "[email protected]";

String reg = "[a-zA-Z_0-9][email protected][a-zA-Z0-9]+(\\.[a-zA-Z]+)+";

reg = "\\[email protected]\\w+(\\.\\w+)+";//简化的规则。笼统的匹配。

boolean b = mail.matches(reg);

System.out.println(mail+":"+b);

}

练习4:网络爬虫


class GetMailList

{

public static void main(String[] args) throws Exception

{

String reg = "\\[email protected][a-zA-Z]+(\\.[a-zA-Z]+)+";

getMailsByWeb(reg);

}

public static void getMailsByWeb(String regex)throws Exception

{

URL url = new URL("http://localhost:8080/myweb/mail.html");

URLConnection conn = url.openConnection();

BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line = null;

Pattern p = Pattern.compile(regex);

while((line=bufIn.readLine())!=null)

{

//System.out.println(line);

Matcher m = p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

bufIn.close();

}

public static void getMails(String regex)throws Exception

{

BufferedReader bufr =

new BufferedReader(new FileReader("mail.txt"));

String line = null;

Pattern p = Pattern.compile(regex);

while((line=bufr.readLine())!=null)

{

//System.out.println(line);

Matcher m = p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

bufr.close();

}

}

时间: 2024-12-17 03:55:03

正则表达的相关文章

正则表达示

这里对正则表达示进行一定程度的总结.为避免太过纠结,这里避开一些 鸡肋 的正则用法. 更多文档参考官方文档 http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html 字符 x 字符 x \\ 反斜线字符 \t 制表符 ('\u0009') \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') \f 换页符 ('\u000C') \a 报警 (bell) 符 ('\u0007') \e 转义

对正则表达这个东西还需要多练习啊

正则表达,如果不配合PHP语言来实现其他功能的话,充其量也就是一行字符串.它最基本的功能就是判断,用来判断某些字符是不是存在于一个已被定义的变量中. 所以,可以用它判断的这个特性来作为function的条件. 另外,正则表达式也具有增删改查的功能,但它最主要的功能就是"查". 最后:从某些方面来说,数据库也算是语言吧.

Java正则表达中Greedy Reluctant Possessive 的区别

上一篇文章<编程思想之正则表达式 >中讲了正则表达式的原理.使用方法和常见的正则表达式总结,本文将进一步探讨Java正则表达中Greedy.Reluctant.Possessive三种策略的区别. 从Java的官方文档http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html中我们可以看到,正则表达式表示数量词的符号有三套,分别是Greedy(贪婪的).Reluctant(勉强的)和Possessive(独占的).

Javascript正则构造函数与正则表达字面量&amp;&amp;常用正则表达式

本文不讨论正则表达式入门,即如何使用正则匹配.讨论的是两种创建正则表达式的优劣和一些细节,最后给出一些常用正则匹配表达式. Javascript中的正则表达式也是对象,我们可以使用两种方法创建正则表达式: 使用new RegExp()构造函数 使用正则表达字面量 先说结果,使用正则表达字面量的效率更高. 下面的示例代码演示了两种可用于创建正则表达式以匹配反斜杠的方法: 1 //正则表达字面量 2 var re = /\\/gm; 3 4 //正则构造函数 5 var reg = new RegE

ruby正则表达

1.Ruby中正则表达式的写法 主要有三种 在//之间,要进行转义 在%r{}内,不用进行转义 Regexp.new()内,不用进行转义 /mm\/dd/,Regexp.new("mm/dd"),%r{mm/dd}三者效果相同,实质都是新建了一个Regexp的类. 2.匹配的两种方法 =~肯定匹配, !~否定匹配.=~表达式返回匹配到的位置索引,失败返回nil,符号左右内容可交换 regexp#match(str),返回MatchData,一个数组,从0开始,还有match.pre_m

通过完善邮箱匹配来一步步学习正则表达

首先,在学习之前先确定一下邮箱的格式,邮箱的一般格式为[email protected],其中xxx可为数字.字母.下划线_,中划线-,点号.,加号+等组成. 在看具体代码之前需要先了解一些基础知识 # []表示匹配字符集中的任意一个字符# \w 表示匹配任何字母数字字符# \s表示任何空格字符# \d表示任何十进制数字# +表示匹配1次或多次前面出现的正则表达# *表示匹配0次或多次前面出现的正则表达# (?:)表示一个匹配不用保存的分组 1.匹配最简单的邮箱格式,如[email protec

JavaScript使用正则表达

JavaScript使用正则表达 正则表达式概述 在前面已经涉及了一些正则表达式的用法,现在将系统地学习正则表达式的语法和 用途.正则表达式主要用于进行字符串的模式匹配,例如判断一个字符串是否符合指定格式等.例如在windows下搜索文件,可以用“*”或者“?”这样的 通配符.在正则表达式的语法中,有更多这样的符号用于表示一个字符串的模式,表7.1列出了所有的特殊符号,它们也被称为元字符. 使用这些元字符,可以表示具有特定模式的字符串,例如: /^\s*$/:匹配一个空行. /\d{2}-\d{

shell正则表达二

shell正则表达 二部分 一.printf命令: 1. 格式化输出.(print  format) 2. 命令格式: printf'打印格式'实际内容 1. 打印格式: 1) \a(警告声音输出) 1) \b(退格键) 1) \n(输出新的一行) 1) \r(帧处于行的开始,即enter键) \t(水平的table键) 1) \v(垂直的table键) 1) \xNN(x为ASCII码十六进制表示:NN为俩位数数字:可转换数字成为字符) 1) %ns(n为数字:s代表string,即多少个字符

转转转---js正则表达exec与match的区别说明

正则表达式对象有两个定义方式:: 1.第一种定义: new RegExp(pattern, attributes);如var reg = new RegExp("abc","g") 其中pattern为表示表达式内容,如上表示匹配abc attributes:g,全局匹配,i不区分大小写,m执行多行匹配,用最多的为g和i 2.第二种定义:/pattern/attributes. 如:var reg = /abc/g; 正则表达的规则一些规则在此不再说明,只记录exe

正则表达示 for Python3

前情提要 从大量的文字内容中找到自己想要的东西,正则似乎是最好的方法.也是写爬虫不可缺少的技能.所以,别墨迹了赶紧好好学吧! 教程来自http://www.runoob.com/python3/python3-reg-expressions.html,感谢菜鸟教程. 一. 在Python3中 正则为 re 模块 import re 二.re.match函数 re.match –>从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话match()就返回none,语法: re.match(p