正则表达式
引入
String就像一个万能的类型,不仅仅有各种字符串的处理操作,也支持有向各个数据类型的转换功能。 所以用户输入都用String 类型。
而我们就要对基本类型进行转换,转换的时候 ,为了保证转换的正确性,往往要进行一些复杂的验证处理,仅仅调用String中的方法是非常麻烦的。这时候引入正则表达式。
认识正则表达式
如果不使用正则表达式 要进行一个字符串数字的计算操作
package 正则表达式;
public class 普通判断 {
public static void main(String[] args) {
普通判断 a = new 普通判断();
String str = "123";
if (a.isNumber(str)){
int num = Integer.parseInt(str);
System.out.println(num * 2);
}
}
boolean isNumber(String s){
char[] a = s.toCharArray();//转换为char类型的数组
for (int i = 0; i < a.length; i++) {
if (a[i] > '0' || a[i] < '9')
return true;
}
return false;
}
}
//这种验证十分简单,但却写了这么多行代码才完成实现下面用正则表达式来实现这种效果
package 正则表达式;
public class 普通判断 {
public static void main(String[] args) {
普通判断 a = new 普通判断();
String str = "123";
if (str.matches("\\d+"));
{
double num = Double.parseDouble(str);
System.out.println(num * 2);
}
}}
//输出246.0
//相较于上面就好用了许多
使用正则最大的特点是在于方便进行验证处理,以及方便进行复杂字符串的修改处理。
常用正则的标记
🐟:单字符匹配 任意字符
\\:匹配'\'
\n:匹配换行符
\t:匹配制表符
🐟:单字符匹配 [abc] 匹配abc任意一个
[^abc] 不是abc的任意一个字符
[a-zA-Z]:表示任意一个a-z范围内的字符
[0-9] : 一位数字所组成。
🐟:简化的字符集
'.':表示任意一个字符的操作集:
’\\d‘ : 表示任意一个[0-9] 的数字
'\\D' : 等价于[^0-9]
'\s' : 匹配任意一个换行符,制表符。(空白的匹配处理)
'\S' : 匹配任意的非空格数据。
’\w‘: 字母、数字、下划线匹配 匹配[a-zA-Z 0-9]
'\W':与'\w‘相反
🐟:匹配边界
^:匹配边界开始
$:匹配边界结束
🐟:数量表示,默认情况下只有添加上了数量单位才能匹配多位字符
● 表达式 ? :该正则可以出现 0 或 1 次。
● * : 可以出现0次、1次、或多次
● + : 可以出现1次或多次
● {n}:表达式长度正好为n次
● {n,}: n次以上
● {n,m} : 出现 n ~ m 次
🐟:逻辑表达式:可以连接多个正则表达式
● 表达式X表达式Y : X紧跟上Y
● 表达式X|Y : X或Y出现一个
● () : 整体描述 为整体描述设置一个数量单位
String对正则的支持
正则表达 大部分处理情况下都会用String类来处理
而很少用正则包来实现。
方法
maches(String regex) : 指定字符串进行正则判断
replaceAll(String,String) : 替换全部
repalaceFirst(String,String) : 替换首个
split(String) : 正则拆分成数组
split(String, int) : 正则拆分成数组
对String支持正则方法的使用案例
应用一:替换所有非字母和数字为空字符串
package 正则表达式;
public class application {
public static void main(String[] args) {
String str = "sdas9812u31 qw 6q #@!das x()^%$";
String regex = "\\W+";
System.out.println(str.replaceAll(regex, ""));
}
}
//输出结果:sdas9812u31qw6qdasx
//可以看到将所有非字母和非数字的字符删除
二:按照每种情况拆分为数组
package 正则表达式;
public class application {
public static void main(String[] args) {
String str = "das231dae121323qd123e";
String regex = "\\d";
// System.out.println(str.replaceAll(regex, ""));
String[] strings = str.split(regex);//按照数字拆分
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i] + "、");
}
}
}
//不加量词 + 的输出das、、、dae、、、、、、qd、、、e、单个比较
//加两次 的输出:das、dae、qd、e、 多个进行比较
思考:如何表示小数
若使用 \\d+\\.\\d+ 匹配的话 输入100 会输出false
因为 .将没有被匹配到 但是100 确确实实可以算为小数
这时候 就要使用到()和 ? 来表示了 使小数点 要么出现要么别出现
\\d+(\\.\\d+)? 来匹配小数 为整体设置了一个数量单位
注意
正则只能判断格式不能判断具体内容是否正确。
遇到复杂的匹配格式 我们要进行拆分处理最后合到一块组成正则表达式。