一、正则表达式语法
正则表达式是一种强大的文本模式匹配工具,常用于文本搜索、替换、验证等任务。以下是一些正则表达式的常用语法和案例示例:
-
匹配字符:
-
.
:匹配任意字符,除了换行符。- 示例:
匹配 “axb”、“a1b”,但不匹配 “a\nb”。
- 示例:
-
[abc]
:匹配字符集中的任意一个字符。- 示例:
[aeiou]
匹配任何一个元音字母。
- 示例:
-
[^abc]
:匹配字符集之外的任意字符。- 示例:
[^0-9]
匹配除数字之外的任意字符。
- 示例:
-
-
匹配重复次数:
-
*
:匹配前一个元素零次或多次。- 示例:
a*
匹配 “a”、“aa”、“aaa”。
- 示例:
-
+
:匹配前一个元素一次或多次。- 示例:
a+
匹配 “a”、“aa”,但不匹配 “aaa”。
- 示例:
-
?
:匹配前一个元素零次或一次。- 示例:
colou?r
匹配 “color” 和 “colour”。
- 示例:
-
{n}
:匹配前一个元素恰好 n 次。- 示例:
a{3}
匹配 “aaa”,但不匹配 “aa” 或 “aaaa”。
- 示例:
-
{n, m}
:匹配前一个元素至少 n 次,最多 m 次。- 示例:
a{2,4}
匹配 “aa”、“aaa”、“aaaa”,但不匹配 “a” 或 “aaaaa”。
- 示例:
-
-
特殊字符转义:
-
\
:用于转义特殊字符。- 示例:
\\
匹配 “”。
- 示例:
-
-
锚点:
-
^
:匹配字符串的开头。- 示例:
^start
匹配以 “start” 开头的字符串。
- 示例:
-
$
:匹配字符串的结尾。- 示例:
end$
匹配以 “end” 结尾的字符串。
- 示例:
-
-
字符类别:
-
\d
:匹配任何一个数字字符。- 示例:
\d{3}
匹配三个连续的数字。
- 示例:
-
\w
:匹配任何一个字母、数字或下划线字符。- 示例:
\w+
匹配一个或多个字母、数字或下划线。
- 示例:
-
\s
:匹配任何一个空白字符(空格、制表符、换行符等)。- 示例:
Hello\sWorld
匹配 “Hello World”。
- 示例:
-
-
分组和捕获:
-
()
:用于创建捕获组。- 示例:
(\d{2})-(\d{2})-(\d{4})
匹配日期格式 “dd-mm-yyyy”,每个组捕获日、月和年。
- 示例:
-
\1
,\2
, …:引用捕获组。- 示例:
(\w+)\s+\1
匹配重复的单词,如 “hello hello”。
- 示例:
-
-
选择:
-
|
:用于在多个模式之间选择一个。- 示例:
apple|orange
匹配 “apple” 或 “orange”。
- 示例:
-
-
边界:
-
\b
:匹配单词边界。- 示例:
\bword\b
匹配 “word”,但不匹配 “wording” 或 “sword”。
- 示例:
-
二、校验手机号
public boolean phoneValidate(String phoneNumber){
if (phoneNumber != null && !phoneNumber.isEmpty()){
boolean matches = Pattern.matches(
"^1[3-9]\\d{9}$|" +
"^1[3-9]\\d{1}[-\\s]\\d{4}[-\\s]\\d{4}$|" +
"^\\(1[3-9]\\d{1}\\)\\d{4}-\\d{4}$|" +
"^(?:\\(\\+\\d{2}\\)|\\+\\d{2})(\\d{11})$|" +
"^0\\d{3}-\\d{7}$|" +
"^0\\d{2}-\\d{8}$", phoneNumber);
return matches;
}
return false;
}
这个代码是一个用于校验手机号的正则表达式验证函数,它可以匹配多种不同格式的手机号。下面是该正则表达式的解释:
"^1[3-9]\\d{9}$|"
// 匹配以1开头的11位数字手机号格式如:13185217412
"^1[3-9]\\d{1}[-\\s]\\d{4}[-\\s]\\d{4}$|"
// 匹配以1开头的带区号的手机号,格式如:131 8521 7412 或 131-8521-7412
"^\\(1[3-9]\\d{1}\\)\\d{4}-\\d{4}$|"
// 匹配以1开头的带区号的手机号,格式如:(131) 8521-7412
"^(?:\\(\\+\\d{2}\\)|\\+\\d{2})(\\d{11})$|"
// 匹配国际格式的手机号,如:(+86)13645678906 或 +8613645678906
"^0\\d{3}-\\d{7}$|"
// 匹配以0开头的带四位区号的座机号,格式如:0755-1234567
"^0\\d{2}-\\d{8}$"
// 匹配以0开头的带三位区号的座机号,格式如:010-12345678
这个正则表达式使用了多个正则模式,每个模式使用|
分隔,表示多个模式中的任何一个匹配即可。这样,它可以用于校验多种手机号和座机号的格式,包括:
- 以1开头的11位数字手机号。
- 以1开头的带区号的手机号,可以是使用空格或短横线分隔的形式。
- 以1开头的带区号的手机号,区号使用圆括号括起来。
- 国际格式的手机号,以两位数的国际区号开头,后接11位数字手机号。
- 以0开头的带区号的座机号,格式如:四位区号-电话号码。
- 以0开头的带区号的座机号,格式如:三位区号-电话号码。
该函数返回一个布尔值,指示输入的phoneNumber是否匹配这些正则表达式中的任何一个。如果匹配,则返回true;否则,返回false。
这个正则表达式的目的是用于验证不同格式的电话号码,包括移动电话和座机号码。
三、正则表达式拼接
要将多个正则表达式拼接在一起,可以使用正则表达式的"或"操作符 |
。这可以在多个表达式之间选择一个匹配。
假设有三个正则表达式,分别用于匹配日期、时间和日期时间:
- 日期正则表达式:
\d{4}-\d{2}-\d{2}
- 时间正则表达式:
\d{2}:\d{2}:\d{2}
- 日期时间正则表达式:
\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}
如果想将它们拼接成一个正则表达式,以匹配日期、时间或日期时间,可以使用 |
操作符:
\d{4}-\d{2}-\d{2}|\d{2}:\d{2}:\d{2}|\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}
这个新的正则表达式将匹配任何一个满足日期、时间或日期时间格式的字符串。
需要注意的是,拼接多个正则表达式时,确保使用括号 ()
将每个子表达式括起来,以便 |
操作符能够正确地应用。此外,还要注意正则表达式的优先级,以确保匹配的顺序符合预期。