正则表达式
引言:java和js同样适用的正则表达式,可能会有略微的差异,等用到的时候再来补充上!
一、正则表达式
1.1 "."和"\"
"."点儿,在正则表达式中表示任意一个字符,eg:.*表示任意字符串。
"\"在正则表达式中是转意字符,当我们需要描述一个已经被正则表达式使用的特殊字符时,我们就可以通过使用"\"将其转变为原本的意思。
\d:表示任意一个数字
\w:表示任意一个单词字符(只能是 数字,字母,下划线)
\s:表示任意一个空白字符(\t \r \n \f \x0B)
\D:表示任意一个非数字字符
\W:表示任意一个非单词字符
\S:表示任意一个非空白字符
\t: 相当于键盘的tab键
\r: 回车,使光标回到行首
\n: 换行,使光标回到下一行,回车换行符号是"\r\n"
\\. :表示" . "," \ " 和 " . "都是特殊字符,要先转义" . ",需要先转义" \ "
1.2 "字符集合 []"
"[]"用来描述单一字符,方括号内部可以定义这个字符的内容,也可以描述一个范围。
eg:
[abc]:表示该字符只能是a或者b或者c;
[123]:表示该字符只能是1或者2或者3;
[a-z]:匹配一个a-z之间的字符;
[a-z]*:匹配任意字母字符串
[0-9]:来表示该字符可以是任意一个数字;
[a-zA-Z0-9_]:表示该字符可以是任意字母,数字以及"下划线"。
1.3 "*"、"+"、"?"
通常我们需要描述的字符串会有很多重复出现的元素,但又不需要严格限制出现的次数时,我们就可以使用"*","+"这些量词。
"+":表示内容可以连续出现至少1次以上
"*":表示上一个式子出现0-若干次,贪心匹配
"?":表示内容出现0-1次
eg:
zo*:表示o可以出校0-n次,z、zo、zoo皆会被匹配出来;
1.4 {n}、{n,}、{n,m}
除了前面讲到的量词外,有时我们也需要要求内容出现的次数有具体要求。比如手机号码。这时我们要求出现的数字就
不能是一个模糊的概念了,而必须要求11位。又比如我们要求用户输入密码时,要求密码是6-15位。遇到这类问题是,我们可以使用:
{n}:表示内容必须出现n次
{n,m}:表示内容出现n-m次
{n,}:表示内容出现至少n次
eg:\d{11} 就表示数字只能出现11位,这样就解决了上述的问题。
1.5 分组() |
通过上面的内容,我们还无法解决类似下面的问题: 在描述电话号码时,前面有区号,区号的形式可以是0086或者+86
那么我们如何在这两个字符串之间选择?
这时我们可以使用分组"()"。() 可以将内容看做一个整体,()中可以使用"|"来表示或关系。
eg:(+86|0086) 表示这里可以是+86或者0086。
1.6 "^"和"$"
(1) 通过在正则表达式的开始添加"^"以及末尾添加"$"来表示一个整体。
若不使用它们,那么正则表达式只匹配某个字符串的部分内容是否符合格式规则,但使用它们,则要求字符串必须从头到尾都满足该格式规则。
(2) "^"当这个字符出现在一个字符集合模式的第一个字符时,表示取反。
eg:
^\w{ 8,10 }$ :表示整体字符串只能出现单词字符8-10个;
[^abc] :取反,表示查找任何不在括号之间的字符;
^$:匹配空行
^R:以R开头的行
R$:以R结尾的行
二、常用方法
1. 使用字符串方法
修饰符 可以在全局搜索中不区分大小写:
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
(1)search(): 用于相匹配的子字符串,并返回子串的起始位置
使用正则表达式搜索字符串,且不区分大小写:
'aBc'.search(/b/i) // 1
使用字符串作为参数, 字符串参数会转换为正则表达式:'aBc'.search('b') // -1
'aBc'.search('B') // 1
(2)replace():用于在字符串中替换一个与正则表达式匹配的子串
使用正则表达式且不区分大小写替换字符串:
'aBc'.replace(/b/i, 'b') // abc
将接收字符串作为参数:
'aBc'.replace('B', 'b') // abc
2. 使用 RegExp 对象
在JavaScript中,RegExp对象是一个预定义了属性和方法的正则表达式对象。
(1)test(): 用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
/b/.test('abc') // true
(2)exec(): 用于检索字符串中的正则表达式的匹配。
该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
/b/.exec('abcb') // ["b", index: 1, input: "abcb", groups: undefined]
3.Pattern
String str = "31DEC20CSX KY TCZ1021.00KY CSX782.00CNY1803.00END"; Pattern pattern = compile("TCZ"+"\\d+.\\d+"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { System.out.println(matcher.group(0)); //TCZ1021.00 }