java正则表达式基础以及正则实现表单参数校验
java正则表达式基础以及正则实现表单参数校验
正则表达式初识
正则表达式定义了 字符串 的模式,可以⽤来搜索、编辑或处理⽂本。
1、正则表达式并不仅限于某⼀种语⾔,但是在每种语⾔中有细微的差别。今天要讲的是 Java正则表达式。
⼀个字符串其实就是⼀个简单的正则表达式,例如 Hello World 正则表达式匹配"Hello World" 字符串
.(点号)也是⼀个正则表达式,它匹配任何⼀个字符如:"a" 或 "1"
\s+ 可以匹配⼀个或多个空格
^ 定义了以什么开始
\d+ 匹配⼀个或多个数字
设置括号内的选项是可选的
\. 匹配 "."
六一快乐祝福语
2、下表列出了⼀些正则表达式的实例及描述:
例1,匹配字符串"this is text":
this is text
例2:
this\s+is\s+text
注意字符串中的 \s+。
匹配单词"this"后⾯的\s+ 可以匹配多个空格,之后匹配 "is" 字符串,再之后 \s+ 匹配多个空格然后再跟上 "text" 字符串。可以匹配这个实例:"this is text"。
例3:
^\d+(\.\d+)?
^ 定义了以什么开始,\d+ 匹配⼀个或多个数字,? 设置括号内的选项是可选的,\.匹配 "."。所以这个正则可以匹配所有正数。可以匹配的实例:"5", "1.5"和 "2.21"。
3、捕获组:
捕获组是把多个字符当⼀个单独单元进⾏处理的⽅法,它通过对括号内的字符分组来创建。
捕获组是通过从左⾄右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
例如:
public static void main(String args[]){
// 按指定模式在字符串查
String line = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建 Pattern 对象
Pattern r = Patternpile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) { //是否有匹配
for (int i = 0;i<=m.groupCount();i++) {
System.out.println("Found value: " + m.group(i) );//匹配的组
}
毕业证弄丢了怎么办} else {
System.out.println("NO MATCH");
}
}
打印结果:
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT
Found value: 3000
Found value: ! OK?
正则表达式语法
在其他的语⾔中(如Perl),⼀个反斜杠 \ 就⾜以具有转义的作⽤,⽽在Java中正则表达式中则需要有两个反斜杠才能被解析为其他语⾔中的转义作⽤。
也可以简单的理解在 Java 的正则表达式中,两个 \\代表其他语⾔中的⼀个\,这也就是为什么表⽰⼀位数字的正则表达式是 \\d,⽽表⽰⼀个普通的反斜杠是 \\\\。
\ : 将下⼀字符标记为特殊字符、⽂本、反向引⽤或⼋进制转义符。例如,"n"匹配字符"n"。"\n"匹配换⾏符。序列"\\\\"匹
配"\\","\\("匹配"("。
^ : 匹配输⼊字符串开始的位置。如果设置了RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。
$ : 匹配输⼊字符串结尾的位置。如果设置了RegExp对象的Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。
* : 零次或多次匹配前⾯的字符或⼦表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。
+ : ⼀次或多次匹配前⾯的字符或⼦表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于{1,}。
: 零次或⼀次匹配前⾯的字符或⼦表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。?等效于 {0,1}。
{n} : n 是⾮负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。
{n,} : n是⾮负整数。⾄少匹配n次。例如,"o{2,}"不匹配"Bob"中的"o",⽽匹配"foooood"中的所有 o。"o{1,}"等效
于"o+"。"o{0,}"等效于"o*"。
{n,m} :m 和 n 是⾮负整数,其中 n <= m。匹配⾄少 n 次,⾄多 m 次。例如,”o{1,3}”匹配”fooooood”中的头三个 o。
’o{0,1}’ 等效于 ‘o?’。注意:您不能将空格插⼊逗号和数字之间。
: 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是”⾮贪⼼的”。”⾮贪⼼的”模式匹配搜索到的、尽可能短的字符串,⽽默认的”贪⼼的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",⽽"o+"匹配所有"o"。
. : 匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使⽤诸如"[\s\S]"之类的模式。
(pattern) : 匹配 pattern并捕获该匹配的⼦表达式。可以使⽤ $0…$9属性从结果”匹配”集合中检索捕获的匹配。若要匹配括号字符( ),请使⽤"\("或者"\)"。
符( ),请使⽤"\("或者"\)"。
(?:pattern) : 匹配 pattern但不捕获该匹配的⼦表达式,即它是⼀个⾮捕获匹配,不存储供以后使⽤的匹配。这对于⽤"or"字符 (|)组合模式部件的情况很有⽤。例如,'industr(?:y|ies) 是⽐ 'industry|industries' 更经济的表达式。
(?=pattern) : 执⾏正向预测先⾏搜索的⼦表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是⼀个⾮捕获匹配,即不能捕获供以后使⽤的匹配。例如,'Windows (?=95|98|NT|2000)'匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先⾏不占⽤字符,即发⽣匹配后,下⼀匹配的搜索紧随上⼀匹配之后,⽽不是在组成预测先⾏的字符后。
(?!pattern) : 执⾏反向预测先⾏搜索的⼦表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是⼀个⾮捕获匹配,即不能捕获供以后使⽤的匹配。例如,'Windows (?!95|98|NT|2000)'匹配"Windows 3.1"中的"Windows",但不匹配"Windows 2000"中的"Windows"。预测先⾏不占⽤字符,即发⽣匹配后,下⼀匹配的搜索紧随上⼀匹配之后,⽽不是在组成预测先⾏的字符后。
x|y : 匹配x或 y。例如,'z|food'匹配"z"或"food"。'(z|f)ood'匹配"zood"或"food"。
[xyz] : 字符集。匹配包含的任⼀字符。例如,"[abc]"匹配"plain"中的"a"。
[^xyz] : 反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。
[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。如果两种前⾯的情况都不存在,则 \nm 匹配⼋进制值nm,其中 n和m 是⼋进制数字(0-7)。
\nml : 当 n 是⼋进制数 (0-3),m 和 l是⼋进制数 (0-7) 时,匹配⼋进制转义码nml。鸳组词语
\un : 匹配 n,其中n是以四位⼗六进制数表⽰的Unicode 字符。例如,\u00A9匹配版权符号 (©)。
java 实现
package st;
import *;
/**
*正则参数校验
*/
public class ValidateUtils {
/**
* 整数.
* "^" :匹配输⼊字符串开始的位置
* "?":零次或⼀次匹配前⾯的字符或⼦表达式
* "[1-9]" : 1-9任意数字
* "\\d" :数字,等效于[0-9]
* "*" :零次或多次匹配前⾯的字符或⼦表达式
* "$" :匹配输⼊字符串结尾的位置
* 合起来就是:以 “-” 开头,“-”可以出现⼀次或零次,第⼀个数字⾮零,其他数字为0到9中的任意数字,可以出现出现零次或多次,以数字结尾。这不就是整    */
private static final String V_INTEGER = "^-?[1-9]\\d*$";
/**
* 正整数
* 同理,以1到9的数字开头,其他数字是0到9中任意数字,可以出现多次或零次,并以数字结尾,即正整数
*/
private static final String V_Z_INDEX = "^[1-9]\\d*$";
/**
* 负整数
* 以“-”开头,紧跟着1到9中的任意数字,后⾯其他数字可以是0到9,可以出现多次或零次,以数字结
尾,即负整数
*/
private static final String V_NEGATIVE_INTEGER = "^-[1-9]\\d*$";
/**
* 数字
* “[+-]”:字符集,可以是+ ,也可以是-
* 同理,以+ 或是 - 开头,+和-可以出现1次或零次,后⾯有数字,有“.”,“.”可以出现0次或⼀次,后⾯⼜有数字,并以数字结尾,即所有数字,包括任意整数    */
private static final String V_NUMBER = "^([+-]?)\\d*\\.?\\d+$";
/**
* 正数
*/
private static final String V_POSITIVE_NUMBER = "^[1-9]\\d*|0$";
/**
* 负数
12月英文*/
private static final String V_NEGATINE_NUMBER = "^-[1-9]\\d*|0$";
/**
* 浮点数
*/
private static final String V_FLOAT = "^([+-]?)\\d*\\.\\d+$";
/**
* 正浮点数
*/
private static final String V_POSTTIVE_FLOAT = "^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$";
/**
/**
* 负浮点数
*/
private static final String V_NEGATIVE_FLOAT = "^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$";
/**
* ⾮负浮点数(正浮点数 + 0)
*/
private static final String V_UNPOSITIVE_FLOAT = "^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$";
2022年小年夜是哪一天
/
**
* ⾮正浮点数(负浮点数 + 0)
*/
private static final String V_UN_NEGATIVE_FLOAT = "^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$";
/**
* 邮件
* “\\w”:匹配任何字类字符,包括下划线。"[A-Za-z0-9_]"
* “+”,出现1次或多次
* “((-\w+)|(\.\w+))*” 和 “((\.|-)[A-Za-z0-9]+)*” 可以出现0次或多次,这个这个地⽅不太明⽩是什么规则
* “\@[A-Za-z0-9]+”出现@、或是任意字符,出现⼀次或多次,
* “\.[A-Za-z0-9]+$” 出现“.”或任意字符,痴线⼀次或多次,然后结尾。
* 可以看出,第⼀是“@”在“.”之前出现,字符开头,字符结尾,⼤概就是邮件的格式吧。
*/
private static final String V_EMAIL = "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$";
/**
* 颜⾊
*/
private static final String V_COLOR = "^[a-fA-F0-9]{6}$";
/**
* url
*/
private static final String V_URL = "^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$";
/**
* 仅中⽂
*/
private static final String V_CHINESE = "^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$";
/**
* 仅ACSII字符
*/
private static final String V_ASCII = "^[\\x00-\\xFF]+$";
/**
混动版* 邮编
* "\\d" 表⽰[0-9],
* "^" 匹配输⼊字符串开始的位置
* "{6}" 表⽰匹配左边相邻字符或表达式6次
* "$" 匹配输⼊字符串结尾的位置
* 连起来就是以数字开头,以数字结尾的6位数
*/
private static final String V_ZIPCODE = "^\\d{6}$";
/**
* ⼿机
* 以 1开头,后⾯是0到9,出现⼗次0到9中任意数字,即11位⼿机号码
*/
private static final String V_MOBILE = "^(1)[0-9]{10}$";
/
**
* ip地址
*/
private static final String V_IP4 = "^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。