当前位置:文档之家› Java与正则表达式学习笔记

Java与正则表达式学习笔记

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来:(1)检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串;(2)根据匹配规则对字符串进行灵活的替换操作。


^ 匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"

$ 匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"

( )标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"

[ ]用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"

{ }修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"

.匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."

?修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"

+修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"

*修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"

|左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"

{n} n 是一个非负整数。匹配确定的 n 次。

{n,} n 是一个非负整数。至少匹配n 次。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

[^m-n]表示某个范围之外的字符,匹配不在指定范围内的字符。

[a-z]表示某个范围内的字符,匹配指定区间内的任何字符

[^xyz]表示一个否定的字符集。匹配不在此括号中的任何字符

[xyz]表示一个字符集,匹配括号中字符的其中之一

{m,n}匹配至少m个,至多n个前面的字符

{n,}匹配至少n次(n为非负整数)前面的字符

a.*?b (开始为a结束为b的最少字符的符合字)

a.*b (开始为a结束为b的最多字符的符合字)

\d{3}(?!\d) (三个位的数字,其后不接一个位数字)

\b\w*q[^u]\w*\b (一个字,其字母里有q但接下来的字母不是u)

(?<=\s)\w+(?=\s) (由空格符分隔开的字母数字字符串)

\b\w{6}\b (查找六个字母数字的字,如ab123c)

\d+ (查找数字字符串)

\ba\w*\b (查找a开头的字,如able)

-------------------------------------------------------------------------------
"^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,比如:"aaa xxx xxx"。

"aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"。

".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。
进一步说明

:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。

"\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。
--------------------------------------------------------------------------------------
Greedy 数量词
X? X,一次或一次也没有

X* X,零次或多次

X+ X,一次或多次

X{n} X,恰好 n 次

X{n,} X,至少 n 次

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

Reluctant 数量词
X?? X,一次或一次也没有

X*? X,零次或多次

X+? X,一次或多次

X{n}? X,恰好 n 次

X{n,}? X,至少 n 次

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

Possessive 数量词
X?+ X,一次或一次也没有

X*+ X,零次或多次

X++ X,一次或多次

X{n}+ X,恰好 n 次

X{n,}+ X,至少 n 次

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

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

预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)

\d 数字:[0-9]

\D 非数字: [^0-9]

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

\S 非空白字符:[^\s]

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

\W 非单词字符:[^\w]

POSIX 字符类(仅 US-ASCII)
\p{Lower} 小写字母字符:[a-z]

\p{Upper} 大写字母字符:[A-Z]

\p{ASCII} 所有 ASCII:[\x00-\x7F]

\p{Alpha} 字母字符:[\p{Lower}\p{Upper}]

\p{Digit} 十进制数字:[0-9]

\p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}]

\p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

\p{Graph} 可见字符:[\p{Alnum}\p{Punct}]

\p{Print} 可打印字符:[\p{Graph}\x20]

\p{Blank} 空格或制表符:[ \t]

\p{Cntrl} 控制字符:[\x00-\x1F\x7F]

\p{XDigit} 十六进制数字:[0-9a-fA-F]

\p{Space} 空白字符:[ \t\n\x0B\f\r]

---------------------------------------------------------------------------------------
(pattern) 匹配并获取 pattern配。要匹配圆括号字符,请使用 '\(' 或 '\)'。

(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配

(?!pattern) 负向预

查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,

x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"

[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

\d 匹配一个数字字符。等价于 [0-9]。

\D 匹配一个非数字字符。等价于 [^0-9]。

\f 匹配一个换页符。等价于 \x0c 和 \cL。

\n 匹配一个换行符。等价于 \x0a 和 \cJ。

\r 匹配一个回车符。等价于 \x0d 和 \cM。

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t 匹配一个制表符。等价于 \x09 和 \cI。

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.

\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。

\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进

制转义值 nml。

\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
---------------------------------------------------------------------------------
常用的正则表达式:
1)国内电话:
^\d{3,4}\-?\d{6,8}$
匹配021-********,0798-678901,不匹配09888-0900000、098-56787




2)电子邮件
^[^@]*@[^@]*$ (不是很精确)




3)国内邮编
^[1-9]\d{5}$



4)一个精确的数字校验
^(([1-9]([0-9]*)?(\.\d+)?)|0|(0\.\d+))$
匹配7,89,700,7.9,0.8,0 不匹配07,08000,89.,0.,00.

只能输入长度为3的字符:“^.{3}$”

只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”

只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”

只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”

只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”

只能输入由数字、26个英文字母或者下划线组成的字符串:“^\w+$”

(?'group') 把捕获的内容命名为group,并压入堆栈

(?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败

(?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分

(?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败


----------------------------------------------------------------------------------------
正则表达式在Java中的应用:

import java.util.regex.Pattern ;
public class RegexDemo02{
public static void main(String args[]){
String str = "1234567890" ; // 此字符串由数字组成
if(https://www.doczj.com/doc/7f8378542.html,pile("[0-9]+").matcher(str).matches()){ // 使用正则
System.out.println("是由数字组成!") ;
}else{
System.out.println("不是由数字组成!") ;
}
}
};
-----------------------------------------------------------------------------------
import java.util.regex.Pattern ;
import java.util.regex.Matcher ;
public class RegexDemo03{
public static void main(String args[]){
String str = "1983-07-27" ; // 指定好一个日期格式的字符串
String pat = "\\d{4}-\\d{2}-\\d{2}" ; // 指定好正则表达式
Pattern p = https://www.doczj.com/doc/7f8378542.html,pile(pat) ; // 实例化Pattern类
Matcher m = p.matcher(str) ; // 实例化Matcher类
if(m.matches()){ // 进行验证的匹配,使用正则
System.out.println("日期格式合法!") ;
}else{
System.out.println("日期格式不合法!") ;
}
}
};
------------------------------------------------------------------------------------
import java.util.regex.Pattern ;
import java.util.regex.Matcher ;
public class RegexDemo04{
public static void main(String args[]){
// 要求将里面的字符取出,也就是说按照数字拆分
String str = "A1B22C333D

4444E55555F" ; // 指定好一个字符串
String pat = "\\d+" ; // 指定好正则表达式
Pattern p = https://www.doczj.com/doc/7f8378542.html,pile(pat) ; // 实例化Pattern类
String s[] = p.split(str) ; // 执行拆分操作
for(int x=0;xSystem.out.print(s[x] + "\t") ;
}
}
};
----------------------------------------------------------------------------------------
import java.util.regex.Pattern ;
import java.util.regex.Matcher ;
public class RegexDemo05{
public static void main(String args[]){
// 要求将里面的字符取出,也就是说按照数字拆分
String str = "A1B22C333D4444E55555F" ; // 指定好一个字符串
String pat = "\\d+" ; // 指定好正则表达式
Pattern p = https://www.doczj.com/doc/7f8378542.html,pile(pat) ; // 实例化Pattern类
Matcher m = p.matcher(str) ; // 实例化Matcher类的对象
String newString = m.replaceAll("_") ;
System.out.println(newString) ;
}
};
-------------------------------------------------------------------------------
import java.util.regex.Pattern ;
import java.util.regex.Matcher ;
public class RegexDemo06{
public static void main(String args[]){
String str1 = "A1B22C333D4444E55555F".replaceAll("\\d+","_") ;
boolean temp = "1983-07-27".matches("\\d{4}-\\d{2}-\\d{2}") ;
String s[] = "A1B22C333D4444E55555F".split("\\d+") ;
System.out.println("字符串替换操作:" + str1) ;
System.out.println("字符串验证:" + temp) ;
System.out.print("字符串的拆分:") ;
for(int x=0;xSystem.out.print(s[x] + "\t") ;
}
}
};
------------------------------------------------------------------------------------
public class RegexDemo01{
public static void main(String args[]){
String str = "1234567890" ; // 此字符串由数字组成
boolean flag = true ; // 定义一个标记变量
// 要先将字符串拆分成字符数组,之后依次判断
char c[] = str.toCharArray() ; // 将字符串变为字符数组
for(int i=0;iif(c[i]<'0'||c[i]>'9'){ // 如果满足条件,则表示不是数字
flag = false ; // 做个标记
break ; // 程序不再向下继续执行
}
}
if(flag){
System.out.println("是由数字组成!") ;
}else{
System.out.println("不是由数字组成!") ;
}
}
};
----------------------------------------------------------------------------------
import java.io.*;
import java.util.regex.*;
public static void search01(){
Reader r = new InputStreamReader( System.in );
BufferedReader br = new BufferedReader( r );
Pattern pattern = https://www.doczj.com/doc/7f8378542.html,pile( ",\\s*" );// 搜索某字串所有","的字元
try{
while (true) {
String line = br.readLine();
String words[] = pattern.split(line);
if (line==null)
break;
int longest=-1;
int longestLength=0;
for (int i=0; i
System.out.println("分段:" + words[i] );
if (words[i].length() > longestLength) {
longest = i;
longestLength = words[i].length();
}
}
Syst

em.out.println( "长度最长为:" + words[longest] );
}
}catch(Exception ex){ex.printStackTrace();};
}
------------------------------------------------------------------------------------

相关主题
文本预览
相关文档 最新文档