前面针对数据安全-数据分类分级方案设计做了分析讲解,具体内容可点击数据安全-数据分类分级方案设计,不再做赘述
上面图片是AI创作生成!如需咒语可私戳哦!
前言
要做数据分类分级,重要的是分类分级模版的合理性和数据识别的准确性。数据识别主要技术涉及正则表达式、关键字典、机器学习、NLP、文档指纹等。对于结构化数据,具有一定规则的数据通常是正则表达式或算法来解决。本篇博客针对日期类型数据的识别展开讲解。
需求
利用正则表达式识别如下日期类型数据,验证是否为合法的日期字符串,并转化为数据库的datetime类型(yyyy-MM-dd HH:mm:ss)
日期格式
本次数据识别针对的日期格式如下
- // 2001年02月10日
yyyy年M月d日- // 二〇一一年三月七日
yyyy年M月d日- // 2001/2/20
yyyy/M/d- // 2001-2-20
yyyy-MM-dd- // 20010220
yyyyMMdd- // 20010220000000
yyyyMMddHHmmss- // 2001/02/07 00:00:00
yyyy/MM/dd HH:mm:ss- // 2001-03-07 14:00:00
yyyy-MM-dd HH:mm:ss- // 2001/2/20 10:00 PM
yyyy/MM/dd hh:mm a
代码
经过验证具体代码如下
package test.dateUtil;
import com.alibaba.excel.util.StringUtils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;
/**
* @author kunZhi
* @date 2023/4/22 19:40
*/
public class DateTest {
public static void main(String[] args) {
regex1("2001年02月10日");
regex1("二〇一一年三月七日");
regex1("2001/2/20");
regex1("2001-2-20");
regex1("20010220");
regex1("20010220000000");
regex1("2001/02/07 00:00:00");
regex1("2001-03-07 14:00:00");
regex1("2001/2/20 10:00 PM");
}
public static String convertChineseNumToArabicNum(String str) {
String[] chineseNums = {"十月", "二十日", "三十日", "月十日", "二十", "三十", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "〇"};
String[] arabicNums = {"10月", "20日", "30日", "月10日", "2", "3", "1", "2", "3", "4", "5", "6", "7", "8", "9", "1", "0"};
for (int i = 0; i < chineseNums.length; i++) {
str = str.replace(chineseNums[i], arabicNums[i]);
}
return str;
}
public static void regex1(String inputDateStr) {
String patternDate = null;
//2001年3月7日
if (Pattern.compile("^\\d{4}年\\d{1,2}月\\d{1,2}日$").matcher(inputDateStr).matches()) {
patternDate = "yyyy年M月d日";
} else if (Pattern.compile("^二[零〇一二三四五六七八九]{1,3}年(十[一二]|[一-九])月(三十|三十一|十[一-九]|二十[一-九]|[一-九])日$").matcher(inputDateStr).matches()) {
//二〇〇一年三月七日
inputDateStr = convertChineseNumToArabicNum(inputDateStr);
patternDate = "yyyy年M月d日";
} else if (Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2}$").matcher(inputDateStr).matches()) {
//2001/3/7
patternDate = "yyyy/M/d";
} else if (Pattern.compile("^\\d{4}-\\d{1,2}-\\d{1,2}$").matcher(inputDateStr).matches()) {
//2001-3-7
patternDate = "yyyy-MM-dd";
} else if (Pattern.compile("^\\d{8}$").matcher(inputDateStr).matches()) {
//20010307
patternDate = "yyyyMMdd";
} else if (Pattern.compile("^\\d{14}$").matcher(inputDateStr).matches()) {
//20010307121212
patternDate = "yyyyMMddHHmmss";
} else if (Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:([0-5]\\d):([0-5]\\d)$").matcher(inputDateStr).matches()) {
//2001/3/7 0:00
patternDate = "yyyy/MM/dd HH:mm:ss";
} else if (Pattern.compile("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:([0-5]\\d):([0-5]\\d)$").matcher(inputDateStr).matches()) {
//2001-3-7 0:00
patternDate = "yyyy-MM-dd HH:mm:ss";
} else if (Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2}\\s(0?\\d|1[0-2]):([0-5]\\d) (AM|PM)$").matcher(inputDateStr).matches()) {
//2001/3/7 12:00 AM
patternDate = "yyyy/MM/dd hh:mm a";
} else {
System.out.println("无法匹配的字符串 :" + inputDateStr);
}
if (!StringUtils.isEmpty(patternDate)) {
Date inputDate = new Date();
if (patternDate.equals("yyyy/MM/dd hh:mm a")) {
DateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm a", Locale.ENGLISH);
format.setLenient(false); // 设置为严格解析日期
try {
inputDate = format.parse(inputDateStr);
} catch (Exception e) {
System.out.println("解析日期字符串出错:" + e.getMessage());
}
} else {
SimpleDateFormat inputDateFormat = new SimpleDateFormat(patternDate);
inputDateFormat.setLenient(false); // 设置为严格解析日期
// 解析输入字符串为Date对象
try {
inputDate = inputDateFormat.parse(inputDateStr);
} catch (Exception e) {
System.out.println("解析日期字符串出错:" + e.getMessage());
}
}
// 将Date对象格式化为目标格式的字符串
SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String outputDateStr = outputDateFormat.format(inputDate);
System.out.println("输入字符串:" + inputDateStr + "目标格式的字符串:" + outputDateStr + "\n");
}
}
}
日期类型数据对应正则表达式
//2001年3月7日
- “^\d{4}年\d{1,2}月\d{1,2}日$” “yyyy年M月d日”
//二〇〇一年三月七日
- “^二[零〇一二三四五六七八九]{1,3}年(十[一二]|[一-九])月(三十|三十一|十[一-九]|二十[一-九]|[一-九])日$”
- “yyyy年M月d日”
//2001/3/7
- “^\d{4}/\d{1,2}/\d{1,2}$” “yyyy/M/d”
//2001-3-7
- “^\d{4}-\d{1,2}-\d{1,2}$” “yyyy-MM-dd”
//20010307
- “^\d{8}$”) “yyyyMMdd”
//20010307121212
- “^\d{14}$” “yyyyMMddHHmmss”
//2001/3/7 0:00
- “^\d{4}/\d{1,2}/\d{1,2}\s\d{1,2}😦[0-5]\d)😦[0-5]\d)$”
- “yyyy/MM/dd HH:mm:ss”
//2001-3-7 0:00
- “^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}😦[0-5]\d)😦[0-5]\d)$”
- “yyyy-MM-dd HH:mm:ss”
//2001/3/7 12:00 AM文章来源:https://www.toymoban.com/news/detail-454710.html
- “^\d{4}/\d{1,2}/\d{1,2}\s(0?\d|1[0-2])😦[0-5]\d) (AM|PM)$”
- “yyyy/MM/dd hh:mm a”
最后
- 好看的灵魂千篇一律,有趣的鲲志一百六七!
- 如果觉得文章还不错的话,可以点赞+收藏+关注 支持一下,鲲志的主页 还有很多有趣的文章,欢迎小伙伴们前去点评
- 如果有什么需要改进的地方还请大佬指出❌
文章来源地址https://www.toymoban.com/news/detail-454710.html
到了这里,关于数据分类分级 数据识别-识别日期类型数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!