Java正则匹配提取年月日字符串

这段代码展示了如何使用Java的正则表达式从字符串中匹配并提取年月日。给定的字符串`9999-9-99`被模式`(\d{4}

Java正则匹配提取年月日字符串

String string1="9999-9-99";
        Pattern p = Pattern.compile("(\\d{4})-(\\d{1,2})-(\\d{1,2})");
        Matcher m = p.matcher(string1);
        if(m.find()) {
            System.out.println(m.group());
            System.out.println(m.group(0));
            System.out.println(m.group(1));
            System.out.println(m.group(2));
            System.out.println(m.group(3));
        }

<think>我们收集了多个Java正则匹配的代码示例,这些示例涵盖了常见的使用场景,如手机号匹配、邮箱匹配、SQL防注入等。下面将逐步展示这些代码示例,并解释其工作原理。 ### 1. 手机号码匹配 手机号码的正则表达式有多种写法,以下是三种常见的实现方式: #### 方式1:使用`Matcher`类 ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class PhoneMatcherExample { public static void main(String[] args) { String phoneNumber = "13812345678"; Pattern pattern = Pattern.compile("^1[3-9]\\d{9}$"); Matcher matcher = pattern.matcher(phoneNumber); if (matcher.find()) { System.out.println("手机号码格式正确"); } else { System.out.println("手机号码格式错误"); } } } ``` #### 方式2:使用`Pattern.matches()`静态方法 ```java import java.util.regex.Pattern; public class PhonePatternExample { public static void main(String[] args) { String phoneNumber = "13812345678"; boolean isValid = Pattern.matches("^1[3-9]\\d{9}$", phoneNumber); if (isValid) { System.out.println("手机号码格式正确"); } else { System.out.println("手机号码格式错误"); } } } ``` #### 方式3:使用`String.matches()`方法 ```java public class PhoneStringExample { public static void main(String[] args) { String phoneNumber = "13812345678"; boolean isValid = phoneNumber.matches("^1[3-9]\\d{9}$"); if (isValid) { System.out.println("手机号码格式正确"); } else { System.out.println("手机号码格式错误"); } } } ``` ### 2. 邮箱地址匹配 ```java public class EmailExample { public static void main(String[] args) { String email = "example@domain.com"; String regex = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; boolean isValid = email.matches(regex); System.out.println("邮箱格式" + (isValid ? "正确" : "错误")); } } ``` ### 3. 中文匹配 ```java public class ChineseCharacterExample { public static void main(String[] args) { String chinese = "中文"; boolean isChinese = chinese.matches("^[\u4E00-\u9FA5]+$"); System.out.println("是否全是中文: " + isChinese); } } ``` ### 4. SQL防注入正则匹配 常用于检测SQL注入风险的关键词: ```java import java.util.regex.Pattern; public class SQLInjectionCheck { public static void main(String[] args) { String input = "select * from users"; String regex = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|" + "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)"; Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); if (pattern.matcher(input).find()) { System.out.println("检测到SQL注入风险"); } else { System.out.println("输入安全"); } } } ``` ### 5. 时间戳格式匹配 匹配格式如 `20220101123045999` 的时间戳(年月日时分秒毫秒): ```java import java.util.regex.Pattern; public class TimestampMatcher { public static void main(String[] args) { Pattern datetime = Pattern.compile("(20?[0-9]{2})(0?[1-9]|1[012])([1-2][0-9]|3[01])\\x20([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]:[0-9]{3}"); String timestamp = "20220101 12:30:45:999"; System.out.println("时间戳格式" + (datetime.matcher(timestamp).matches() ? "正确" : "错误")); } } ``` ### 6. 经纬度匹配 ```java public class LatitudeLongitudeMatcher { private static final String PATTERN = "^-?[1-9]?\\d(\\.\\d+)?|\\-?1[0-7]?\\d(\\.\\d+)?$"; public static boolean isValidLatOrLong(String latOrLong) { return latOrLong.matches(PATTERN); } public static void main(String[] args) { String coordinate = "116.397128"; System.out.println(coordinate + "是有效的经纬度: " + isValidLatOrLong(coordinate)); } } ``` ### 正则表达式说明 | 表达式 | 说明 | |-----------------|----------------------------------------------------------------------| | `^1[3-9]\d{9}$` | 匹配以1开头,第二位为3-9,后面跟9位数字的字符串 | | `[\u4E00-\u9FA5]` | 匹配中文字符 | | `\w+([-+.]\w+)*` | 匹配由字母、数字、下划线组成的字符串,可包含`-`、`+`、`.`等连接符号 | ### 常见问题 1. **正则表达式中的特殊字符**:如`.`、`*`、`+`、`?`等具有特殊含义,需要使用`\`转义。 2. **匹配模式**:默认区分大小写,使用`Pattern.CASE_INSENSITIVE`开启不区分大小写匹配。 3. **性能考虑**:复杂的正则表达式可能影响性能,应避免在循环中重复编译正则表达式。 ### 进阶用法 - **分组提取**:使用`()`分组,通过`Matcher.group(index)`提取匹配内容。 - **非贪婪匹配**:在量词后加`?`,如`*?`、`+?`,实现最小匹配。 §§相关问题§§ 1. 如何用正则表达式匹配URL? 2. 如何提取字符串中的特定部分(如提取所有数字)? 3. 正则表达式在匹配中文时需要注意什么? 4. 如何优化正则表达式的性能? </think>以下为 Java 正则匹配的实用代码示例,涵盖常见场景的实现方案: ### 一、基础匹配方法 #### 1. 手机号码验证 ```java // 方式1:使用Matcher类 String phone = "13812345678"; Pattern pattern = Pattern.compile("^1[3-9]\\d{9}$"); // 匹配11位手机号 Matcher matcher = pattern.matcher(phone); if (matcher.matches()) { System.out.println("有效手机号"); } // 方式2:直接使用String.matches()简化版 if (phone.matches("1[3-9]\\d{9}")) { System.out.println("有效手机号"); } ``` #### 2. 邮箱格式验证 ```java String email = "user@example.com"; String regex = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w{2,4}$"; boolean isValid = email.matches(regex); // true ``` #### 3. 中文内容匹配 ```java String text = "你好世界Hello"; text = text.replaceAll("[^\u4E00-\u9FA5]", ""); // 移除非中文字符 System.out.println(text); // 输出:你好世界 ``` ### 二、高级应用场景 #### 1. SQL 注入防护 ```java String input = "SELECT * FROM users; DROP TABLE users"; String dangerPattern = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|" + "\\b(SELECT|UPDATE|DELETE|DROP|EXEC)\\b"; if (Pattern.compile(dangerPattern, Pattern.CASE_INSENSITIVE).matcher(input).find()) { System.err.println("检测到SQL注入风险!"); // 触发警报 } ``` #### 2. 时间戳格式验证 ```java String timestamp = "20230101 12:30:45:999"; Pattern datetime = Pattern.compile( "(20?[0-9]{2})(0?[1-9]|1[012])([12][0-9]|3[01])\\s" + "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]:[0-9]{3}" ); System.out.println(datetime.matcher(timestamp).matches()); // true ``` #### 3. 经纬度验证 ```java String lat = "39.904202"; String lon = "116.407394"; String coordPattern = "^-?[1-9]?\\d(\\.\\d+)?|\\-?1[0-7]?\\d(\\.\\d+)?$"; boolean validLat = lat.matches(coordPattern); // true boolean validLon = lon.matches(coordPattern); // true ``` ### 三、代码逻辑提取 #### 1. 提取所有数字 ```java String text = "订单号:ORD2023-001,金额:¥128.50"; Pattern p = Pattern.compile("\\d+\\.?\\d*"); Matcher m = p.matcher(text); while (m.find()) { System.out.println("发现数字: " + m.group()); // 输出: 2023, 001, 128.50 } ``` #### 2. 复杂条件语句匹配 ```java String code = "if(\"1\".equals(\"1\") || 2+3==5 && 2>3?true:false){"; String ifPattern = "if\\([\\w\\!&<=+\\-*/|.\\(\\)\"\\s?:]+\\)\\{"; if (code.matches(ifPattern)) { System.out.println("有效条件语句"); } ``` ### 四、最佳实践建议 1. **预编译模式提升性能** ```java // 多次使用的正则应预编译 private static final Pattern PHONE_REGEX = Pattern.compile("^1[3-9]\\d{9}$"); boolean isValid = PHONE_REGEX.matcher("13800138000").matches(); ``` 2. **特殊字符转义处理** ```java String searchKey = "user+input"; String safeInput = Pattern.quote(searchKey); // 转义特殊字符 ``` 3. **分组提取数据** ```java String date = "2023-12-31"; Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})"); Matcher m = p.matcher(date); if (m.find()) { System.out.println("年: " + m.group(1)); // 2023 System.out.println("月: " + m.group(2)); // 12 } ``` ### 正则符号速查表 | 符号 | 含义 | 示例 | |--------|----------------------|--------------------------| | `\d` | 数字字符 | `\d{3}` 匹配三位数字 | | `\w` | 单词字符(字母数字下划线)| `\w+` 匹配单词 | | `\s` | 空白字符 | `\s+` 匹配空格/tab | | `[ ]` | 字符集合 | `[A-Za-z]` 匹配所有字母 | | `^` | 行首 | `^Start` 匹配行首的Start| | `$` | 行尾 | `end$` 匹配行尾的end | > 提示:复杂正则建议使用在线工具调试,如 [regex101.com](https://regex101.com/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangphil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值