正则表达式
正则表达式(regular expression)是一种描述字符串的一种匹配模式(pattern)的表达式。借助正则表达式我们可以检查输入的字符串中是否包含我们需要的子串,并进行替换等操作;
比如说我们需要完成如下任务:
对一行给定的字符串,去除中间不满足条件的分隔符。 例如输入字符串:
I am an 20-years out--standing @ * -stu- dent去除中间的除字母、数字的字符(保留两个字母之间的-)。 输出:I am an 20-years out standing stu dent
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String S = input.nextLine();
String S = s.replaceAll("((?<=\\W|\\D)-(?=\\W|\\D))", " ");
S = S.replaceAll("[ ]{2,}", " ");
System.out.println("S: " + S);
String[] subs = S.split(" ");
Deque<String> stack = new ArrayDeque<>();
for(String elem : subs) {
stack.push(elem);
}
String res = String.join(" ", stack);
System.out.println(res);
}
Java 的
String.matches(regex, str)方法,必须要整个字符串匹配这个模式才会返回true而不是 子串匹配即可,java doc 里面写了。
构成
正则表达式是由普通字符(a-z、0-9 等等)和特殊字符(元字符)构成文字模式(pattern),可以描述搜索文本时匹配一个或多个字串(模式中可以指定)。
匹配顺序
输入的字符串从左到右逐个字符地匹配正则表达式模式,匹配成功则会回到匹配成功的位置加一个字符去匹配,直到达到最长。默认的匹配模式就是像这样的贪心模式。
普通字符
普通字符包括可打印的(abcd1234 等等)和不可打印的(\n、\t等等空格或换行字符)
特殊字符
特殊字符在正则表达式中具有特定的含义,如果其中有字符需要参与匹配的话,则需要通过反斜杠 \ 转义。
字符簇
字符簇代表了一簇可匹配的字符,但只能表示一个字符,配合限定符使用可以匹配多个字符模式;
[A-Z0-9] // 匹配一个大写字母或数字
[^0-9] // 匹配除数字以外的任意字符
[12][0-9]{3} // 匹配1000-2999范围内的数字
圆括号运算符
(?:pattern):不保存匹配的pattern;pattern1(?=pattern2):当pattern2匹配成功,字符串才从pattern2开始往前匹配pattern1,也就是括号内的先作预测用,不参与匹配中;pattern1(?!pattern2):当pattern2匹配不成功,字符串才从pattern2开始往前匹配pattern1,和以上的命令相反;(?<=pattern2)pattern1:当pattern2匹配成功,字符串才从pattern2开始往后匹配pattern1,也就是括号内的先作预测用,不参与匹配中;(?<!pattern2)pattern1:当pattern2匹配成功,字符串才从pattern2开始往后匹配pattern1,和以上的命令相反;
限定符
[a-z]? // 零次或一次
[a-z]* // 零次或多次
[a-z]+ // 一次或多次
[a-z]{0,2} // 0~2次
[a-z]{2} // 两次
[a-z]{2,} // 两次及以上
定位符
^匹配开始位置;$匹配结束位置;
模式改变
? 紧跟在限定符后可以将匹配模式改为非贪婪的;
一些有特别意义的匹配符
.:匹配除了\n\r以外的单个字符;\d:匹配一个数字,等同[0-9]\D:匹配一个非数字,等同[^0-9]\w:匹配一个字母、数字、下划线,等同[a-zA-Z0-9_]\W:匹配一个非字母、数字、下划线,等同[^a-zA-Z0-9_]\s:匹配任何空白字符,等同[\f\n\r\t\v]\S:匹配任何非空白字符,等同[^\f\n\r\t\v]\f:匹配换页符\n:匹配换行符\r:匹配回车符\t:匹配制表符\v:匹配垂直制表符
\b:匹配边界,比如er\b就可以匹配never而不能匹配verb\B:不匹配边界,比如er\b就可以匹配verb而不能匹配never
更多的元字符可以看菜鸟教程。