由于在实际应用中经常要对字符串进行较为复杂的操作,所以编程语言在长时间的演变中,出现了一种用事先定义好的特定字符或者这些字符的特定组合来表示一种描述字符串的规则的"规则字符串",这种规则字符串被称为正则表达式,正则表达式提供了一种对字符串进行过滤的过滤规则。
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
java中预定义了一些常用的字符分类并以特定符号表示,需要注意的是,带有转义字符的字符需要两个\,具体如下:
‘.‘ 任何字符(与行结束符可能匹配也可能不匹配)
‘\d‘ 数字:[0-9]
‘\D‘ 非数字: [^0-9]
‘\s‘ 空白字符:[ \t\n\x0B\f\r]
‘\S‘ 非空白字符:[^\s]
‘\w‘ 单词字符:[a-zA-Z_0-9]
‘\W‘ 非单词字符:[^\w]
为方便对特定格式字符串的操作,java将常见的格式的边界分隔字符进行了封装并用特定字符表示,具体如下
‘^‘ 行的开头
‘$‘ 行的结尾
‘\b‘ 单词边界
‘\B‘ 非单词边界
‘\A‘ 输入的开头
‘\G‘ 上一个匹配的结尾
‘\Z‘ 输入的结尾,仅用于最后的结束符(如果有的话)
‘\z‘ 输入的结尾
为了表示特定格式字符的数量,java用{}来表示数量,并定义了一些特殊字符表示特定数量,具体如下:
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
为了表示文本中符合规则的特定序列能够重用,java中定义了组的概念,组用()符号进行划分,用\0-\9进行表示,\0一般表示为整个字符串,所以可以理解为组从\1处开始定义;$0-$9符号则表示与其相邻的前一个字符串中的组;
可以通过Matcher对象的find()方法和group()方法完成类似迭代器中hasNext()方法和next()方法的迭代动作来获取给定格式的子串并对这些子串进行操作;
为了简化书写,java在String类中封装了replaceAll()、matches()、split()等方法,使编程人员不必创建Pattern对象及Matcher对象就可以实现通过正则表达式的一些简单单一操作;