文章目录
1、常用的正则表达式
1.1、整数
- 除了0,其他整数不能以0开头
- 最大只能9个9,不会超出Java的int类型最大大小
txt
/^[0]$|^[1-9]\d{0,8}$/
1.2、只允许数字+字母+中文
js
//返回true,则符合要求
/[0-9a-zA-Z\u4e00-\u9fa5]+/
js
//返回true,则说明有特殊字符
/[^0-9a-zA-Z\u4e00-\u9fa5]/
2、Mysql中使用正则表达式
- 注意在Mysql中,中文表示范围的方式和java中不一样
java
java的:\u4e00-\u9fa5
//这里的范围可能采用 UTF-8 的标准,低于mysql8的版本使用这个会报错
mysql的:\x{4e00}-\x{9fff}
//这里的[一-龥]是一个简化的范围表示,用于匹配大部分常用中文字符。但请注意,这并不能覆盖所有中文字符(特别是超出一-龥范围的生僻字或新增的汉字),但它在很多日常应用中能够工作。
mysql的另一种:一-龥
- 筛选出含有有特殊字符的记录:使用 NOT REGEXP 则可对结果取反
sql
SELECT *
FROM t_device
WHERE t_device.DEVICE_NAME REGEXP "[^\\x{4e00}-\\x{9fff}0-9a-zA-Z]";
3、Notepad++使用正则表达式
-
Notepad++的字符串匹配都是按行处理的
-
查找所有以 # 开头的行或文本
shell^\# -
查找以load_this结尾的完整一行
shell.*load_this$ -
查找--的注释
shell--.*
其他
作者历史理解错误的正则表达式
- 这些错误都是作者本身的思维惯性导致的
js
//表达式一
/0*(10*1)*0*/
//中间的(10*1)
//我把 10当成一个整体,然后算上运算符*,这个理解是错误的。
//正确的理解是 0和*生成一个运算符。然后两边的1都是独立的字符
全局匹配模式(g)
- 对于同一个正则对象重复调用就会出现下一次的匹配位置从上一次匹配结束的位置开始
- 非全局匹配模式(默认)(i)
字符串写正则表达式转义问题
- Java常见的转义字符
- 正则表达式字符转义
- 实际表达式=java程序解析后得到的字符串实际值
| 代码写的字符串 | 实际表达式 | 用法总结 | 备注 |
|---|---|---|---|
| "abc" | abc | 正确 | 字符串和正则表达式都无需转义,最为简单,两边都相同 |
| ( | ( | 正确 | 对于字符串 <英文括号>不需要转义,这里的括号是正则表达式中的正常括号用法(非字符) |
| "\\" | \ | 正确 | 对于转义字符,字符串中转义字符串需要转义一次,这里的转义字符正则表达式中的正常转义用法(非字符) |
| "\(" | ( | 冗余 | 这里字符串中的转义字符白写了,转义<英文括号>之后,还是<英文括号>,这里的括号是正则表达式中的正常括号用法(非字符) |
| "\\(" | \( | 正确 | 字符串中的转义字符对转义字符进行转义,实际上正则表达式只收到一个转义字符。这里的括号是正则表达式中的字符用法(字符) |
| "\"" | " | 正确 | 对于<英文双引号>,在字符串是转移字符,需要转义。但是在正则表达式中并不是转义字符,直接可以作为符号使用。 |
| "\\\"" | \" | 冗余 | 字符串中多写了两个转义字符,正则表达式中对普通字符<英文双引号>转义,还是<英文双引号> |
| "," | , | 正确 | <英文逗号>对于字符串和正则表达式都是普通字符,参考普通字符的用法即可 |
| "\\:" | : | 正确 | <英文冒号>,参考<英文括号>的用法即可 |
| "\\[" | [ | 正确 | <中括号>,参考<英文括号>的用法即可 |
| "\\{" | { | 正确 | <大括号>,参考<英文括号>的用法即可 |
| "-" | - | 正确 | 在中括号中以开头或者末尾使用时,参考普通字符的用法即可 |
| "\\-" | \- | 正确 | 横杠在中括号是特殊符号,非开头或者末尾,参考<英文括号>的用法即可 |
| "_" | _ | 正确 | 参考普通字符的用法即可 |
xml文件读取字符串转义问题
- XML中的转义字符
- 对于在XML中编写正则表达式,无需多写转义字符。只需要把XML本身需要转义的字符稍微处理一下即可。本质原因是XML的转义符号和正则表达式不同,
java
//程序读取之后,实际为\
//java中
String temp="\\";
//xml中
temp="\"
//程序读取之后,实际为\(
//java中
String temp="\\(";
//xml中
temp="\("
//对于这则表达式:^[0]$|^[1-9]\d{0,8}$
//java中
String temp="^[0]$|^[1-9]\\d{0,8}$";
//xml中
temp="^[0]$|^[1-9]\d{0,8}$"
java通过正则表达式找时间
java
/**
* 通过正则表达式找到时间
*
* @param s
* @return
*/
private String fingDate(String s) {
String[] dateExp = {"\\d{4}年\\d{1,2}月\\d{1,2}日\\d{1,2}时\\d{1,2}分",
"\\d{4}年\\d{1,2}月\\d{1,2}日\\d{1,2}时",
"\\d{1,2}月\\d{1,2}日\\d{1,2}时\\d{1,2}分",
"\\d{4}年\\d{1,2}月\\d{1,2}日"};
for (String exp : dateExp
) {
String date = fingDate(s, exp);
if (date != null) {
//匹配到其中一个就返回结果
return date;
}
}
//返回当前时间
return new SimpleDateFormat("yyyy年MM月dd日HH时mm分").format(new Date());
}