前言
其实,之前没想过写这一篇的内容,只是最近发现工作的时候有时候遇到的一些需要使用正则表达式解决的问题好像并不是一下子就能写出一个正确的正则,需要多次的修改,调整,当然,这和我的正则水平不到家有很大的关系,所以就有了这篇内容,我打算把工作中遇到的一些有意思的正则表达式记录下来。可能有大佬看到这些文章,不喜勿喷,谢谢。
习题
1. 去除字符串首尾的空格
这个需求,对于经常编程的同学来说,一个函数即可搞定,例如使用我最喜欢的大 java
,一个 trim
函数即可
public static void main(String[] args) {
String str = " a b C 1112 3 ";
System.out.println(str.trim());
}
输出 ‘a b C 1112 3’
可以看出来,字符串首尾的空格都被去掉了,字符串中间的空格不受影响。
那么,问题来了,如何用正则表达式实现这个效果???
分析:
第一版:
首尾都有可能有空格,中间是数字、字母、空格的组合,正则来了
^\s*([\d\s\w]+)\s*$
so easy!!! 但是,不幸的是,测试的时候发现,因为我们不确定字符串的末尾到底有没有空格,贪婪匹配会把后面的空格全部匹配到,无法满足我们的需求。
分析:
第二版:
贪婪模式不行,试试非贪婪模式
^\s*([\d\s\w]+?)\s*$
测试,发现结果还是一样,不满足要求。
分析:
第三版:
是不是可以利用环视,在字符串开始和结束之间找到一个左边是空格挨着不是空格,结尾时右边是空格,左边不是空格的地方
^(?<\s+)[\d\s\w]+[\d\s\w]+(?=\s)$
然而,并没有生效。
分析:
第四版:
我们需要的是首尾非空格的那一部分字符串,因此,需要的部分第一位和最后一位一定不是空格,于是:
^\s*([\d\w]+[\d\w\s]+[\d\w]+)\s*$
测试,果然如预期一样,这里给新来的同学结介绍一个非常好用的正则表达式测试网站 https://regex101.com/
于是上面的需求就变得很简单了:
public static void main(String[] args) {
String str = " a b C 1112 3 ";
System.out.println(str.replaceAll("^\\s*([\\d\\w]+[\\d\\w\\s]+[\\d\\w]+)\\s*$", "$1"));
}
这个问题就分享到这里了,我相信我上面的部分分析应该也可以写出对应的正则来完成需求,只是个人能力有限,没有实现出来,感兴趣的同学可以自己尝试,有知道的正解的大佬欢迎分享答案,谢谢。以后有类似的关于正则的问题我会继续更新。
上面的题刚刚看到以为大佬的分享,使用两个正则表达式,分别替换字符串前面的空格和后面的空格
# 替换字符串前面的空格
^[ ]*
等价于
^[\s]*
# 替换字符串后面的空格
[ ]*$
等价于
[\s]*$