目录
懒惰匹配:匹配尽可能少的字符 regex="a.*?d"; 懒惰匹配
介绍:
正则表达式是由一些特殊含义的字符组成的字符串,多用于查找、替换符合规则的字符串。
主要使用Pattern以及Matcher实现
在Java web中导入这两个类
<%@ page import="java.util.regex.Pattern" %>
<%@ page import="java.util.regex.Matcher" %>
Pattern与Matcher的用法
Pattern作用是给正则表达式一个匹配模式
Matcher作用是怎加表达式匹配字符串的权力
看以下代码来初步了解该表达式
<%
Pattern pattern;//创建一个Pattern对象
Matcher matcher;//创建一个Matter对象
String input="ffsssdffdjfffsssff";//要匹配的字符串
String regex="(ff)(sss)";//匹配模式,与ffsss进行匹配,至于括号作用在下面会说明,以及在后面文章中有正则元字符的介绍
pattern=Pattern.compile(regex);
//将匹配模式传入Pattern并且创建pattern对象
matcher=pattern.matcher(input);
//将要匹配的字符串传入,创建matcher对象
while(matcher.find()){//matcher.find()表示查找符合匹配的字符,
//从字符串首地址开始,如果匹配则返回true,下次匹配从当前位置开始,直到字符末地址返回false
out.println(matcher.group());
//表示输出匹配到的字符串, matcher.group(1)表示输出,匹配到的字符串中第一个括号中的内容也就是ff
//matcher.group(2)输出,匹配到的字符串中第二个括号中的内容也就是sss
out.println(matcher.start());
//Matcher中的start()和end()。start(),点进方法可以看到返回的是上一个匹配项的起始索引,如果没有 匹配项将抛出IllegalStateException异常。同理,end()则为结束的索引。
}输出为ffsss 0 ffsss 11
%>
常用正则元字符
元字符过多,只介绍常用的元字符
-
正则:普通字符
如: aaa 上面例子就是普通正则原字符
-
正则:\d
如:aaa\d
表示匹配的字符是aaa开头还要加一个数字,例如:aaa4
<%
Pattern pattern;
Matcher matcher;
String input="dnsfaaa4";
String regex="aaa\\d";//注意:在Java定义的正则里,由于一个\表示的是字符串转义,因此在Java定义带有\的元字符时,还需要多写一个\,即\\,至于其他语言,自己可查阅相关资料进行了解。
pattern=Pattern.compile(regex);
matcher=pattern.matcher(input);
while(matcher.find()){
out.println(matcher.group());
out.println(matcher.start());
}//输出为aaa4 4
%>
为了不累赘,这里不贴过多贴代码了,有问题写在评论区啦
-
正则:\w
表示一个字母(大小写都可以),数字,或者下划线
-
正则:.
. (小数点) 则表示“\n”和"\r"之外的任何单个字符。
-
正则:?
? 表示匹配前面的子表达式零次或一次。
-
正则:*
? 表示匹配前面的子表达式零次或一次。例如: -?[0-9] 表示一位数的正数或者负数(-?中的 - 表示符号负号,?表示出现)
-
正则:^
^表示匹配字符串的开始(在集合字符里[^a]表示非(不匹配)的意思,例如[^abc]表示出了abc之外的任意字符
-
正则:\s
\s:匹配任意的空白符 空格。例如:\d^a\s 第一个字符为数字,第二个字符为除a的任意值,第三个字符为空格; 如 2h ,7O ,3
常用反义元字符
反义字符:多用于查找除某个字符以外其他任意字符均可以的情况
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符,如+,- |
\S | 匹配任意不是空白符的字符,如,;’ |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
字母都是大写,与小写字母一起记忆 \w , \s , \d , \b 分别表示,
\w:匹配一个字母(大小写都可以),数字,或者下划线
\s:匹配任意的空白符 空格
\d:匹配数字
\b匹配单词的开始或结束,例如:
<%
Pattern pattern;
Matcher matcher;
String regex="\\bOlive\\b";//注意:在Java定义的正则里,由于一个\表示的是字符串转义,因此在Java定义带有\的元字符时,还需要多写一个\,即\\,至于其他语言,自己可查阅相关资料进行了解。
pattern=Pattern.compile(regex);
String input="I Love Oliver and Olive";
matcher=pattern.matcher(input);
double sum=0;
while (matcher.find())
{
out.print(matcher.group());
}
%>
限定字符
限定字符多用于重复匹配次数
常用的限定符
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
懒惰匹配和贪婪匹配
-
懒惰匹配:匹配尽可能少的字符 regex="a.*?d"; 懒惰匹配
懒惰限定符
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
懒惰匹配例子:
<%
Pattern pattern;
Matcher matcher;
String regex="a.*?b";//懒惰匹配
pattern=Pattern.compile(regex);
String input="asnbaeb";
matcher=pattern.matcher(input);
double sum=0;
while (matcher.find())
{
out.println(matcher.group());
}输出为asnb和aeb
%>
贪婪匹配:
如果改成:regex2="a.*d"; 为贪婪匹配,那么输出为asnbaeb;
常用的实用正则表达式整理
(摘自自学编程网)
- 只能输入数字:"^[0-9]*$"。
- 只能输入n位的数字:"^"d{n}$"。
- 只能输入至少n位的数字:"^"d{n,}$"。
- 只能输入m~n位的数字:。"^"d{m,n}$"
- 只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
- 只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
- 只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
- 只能输入非零的正整数:"^"+?[1-9][0-9]*$"。
- 只能输入非零的负整数:"^"-[1-9][]0-9"*$。
- 只能输入长度为3的字符:"^.{3}$"。
- 只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
- 只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
- 只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
- 只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
- 只能输入由数字、26个英文字母或者下划线组成的字符串:"^"w+$"。
- 验证用户密码:"^[a-zA-Z]"w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
- 验证是否含有^%&’,;=?$""等字符:"[^%&’,;=?$"x22]+"。
- 只能输入汉字:"^["u4e00-"u9fa5]{0,}$"
- 验证Email地址:"^"w+([-+.]"w+)*@"w+([-.]"w+)*"."w+([-.]"w+)*$"。
- 验证InternetURL:"^http://(["w-]+".)+["w-]+(/["w-./?%&=]*)?$"。
- 验证电话号码:"^("("d{3,4}-)|"d{3.4}-)?"d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
- 验证身份证号(15位或18位数字):"^"d{15}|"d{18}$"。
- 验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
- 验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
练习:
只看不练假把式
下面给个题目练练
题:一次李华给他的朋友写信,其中分为三个自然段,
(第一自然段为20个词,第二然段是25个词,第三自然段20.5个词)问该文章有多少个词
使用:“第一自然段为20个词,第二然段是25个词,第三自然段20个词”作为字符串的输入
<%
Pattern pattern;
Matcher matcher;
String regex="-?[0-9][0-9]{0,5}[.]?[0-9]{0,6}";
pattern=Pattern.compile(regex);
String input="第一自然段为20个词,第二然段是25个词,第三自然段20.5个词";
matcher=pattern.matcher(input);
double sum=0;
while (matcher.find())
{String str=matcher.group();
sum +=Double.parseDouble(str);
}
out.print(sum);
%>
这些都是正则表达式中基础的部分,这篇文章适合没接触正则表达式或者不太了解的人群,想要更加深刻的理解还要多家练习。
一起进步,多加指正。