本学期前半学期刚刚学习了形式语言与自动机,其中最先讲到的就是正则语言,Java中的正则表达式与课堂上的内容形式上略有区别,但万变不离其宗。在构建某些依赖于许多其他ADT的对象时使用正则表达式可以大大减少客户端创建各种成员ADT的工作量。用户只需要输入一个符合特定格式的String,而我们可以将这个字符串按一定规则解析并使用输入的信息创建所需的对象。
用法
首先是Java中正则表达式的用法,需要导入java.util.regex:
Pattern regexPattern = Pattern.compile(regex);//regex是正则表达式,即“规则”
Matcher matcher = regexPattern.matcher(string);
之后调用matcher.matches()可以判断输入的string是否符合regex定义的规则。
如果并不需要检验多个字符串是否都符合同一表达式,而是只想知道一个字符串是否符合某个正则表达式时也可以使用一种更简洁的写法
string.matches(regex);
转义符
一些符号在正则表达式中是有其语法上的含义的,如引号,小括号,中括号和*,|等等,但有时我们也会需要以字符形式使用这些符号,这时就需要引入转义符"\"。有趣的是,并非所有符号前都只需要加一个转义符,有的需要加两个,在此举例如下:
- 引号:\"(只需一个转义符)
- 小括号:\\( (两个转义符)
最有效的确认如何输入的办法就是上手实操,IDEA环境下在Pattern.compile()的输入中尝试输入即可得知自己输入的正则表达式是否符合语法,不符合时IDE会直接报错。
使用中文
有时我们需要在正则表达式中使用中文字符,经查找资料发现可以用汉字编码来实现。在UTF-8编码下中文字符编码范围是u4E00-u9FA5。注意字符编码前面也需要加转义符,最终的形式是\\u4E00-\\u9FA5
一个例子
接受型如: “名称”(一位数字) |"名称"(一位数字)··· 的串
Pattern regexPattern = Pattern.compile("(\"([a-zA-Z0-9_\\u4E00-\\u9FA5])*\"\\([\\d]\\)\\|)*\"([a-zA-Z0-9_\\u4E00-\\u9FA5])*\"\\([\\d]\\)");
Matcher matcher = regexPattern.matcher("\"汉字1ABc\"(7)|\"khador\"(3)");
if (matcher.matches()){
System.out.println("yes!");
}
其他
可以使用regex101: build, test, and debug regex来在线编辑正则表达式并作检验,还能输出具体的匹配结果,在转义符问题上似乎与java略有出入,但仍是非常好的学习工具。