Java字符串(主要是正则表达式)
Peng's Blog 只记录和技术相关的东西

Java字符串(主要是正则表达式)

2017-07-22

最开始接触正则表达式是大一暑假的时候,但对这个东西一直有点畏惧感,用的不是很多。可是我又不想一直都停留在原地,所以决定系统的归纳一下正则表达式。正好在钻研《Java编程思想第4版》,而且正则表达式属于第13章字符串的一个小节,所以一起梳理了一遍。

不可变String

​ String对象是不可变的。String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象。

​ 以String当方法的参数的时候,传的都是String的拷贝,而不是引用。

重载加号和StringBuilder

​ String类重载了 加号 和 +=

​ 具体的实现的话,编译器自动引入了StringBuilder类。

​ StringBuilder很方便而且开销较小,但是线程不安全。 StringBuffer是线程安全的。

Java本身是不支持重载的,String里面的 + 是唯一一个特例。

无意识的递归

​ 在重写对象的toString方法的时候,方法里面。

​ 打印地址的时候不要用 this.toString() 。要调用Object的toString方法。

​ 所以不用this,用 super.toString();打印当前的地址

String上的操作

​ 好多,基本上都用过了。

​ 补充说明:当需要改变字符串的内容的时候,String类的方法都会返回一个新的String对象。

同时,如果内容没有发生改变,Sting的方法只是返回指向原对象的引用而已。这样可以节约存储空间,以及避免额外的开销。

Java5的格式化输出。printf方法、format方法和printf等价,使用类似于C语言的printf

​ System.out.printf(“%s:%f”, “@3”,0.7f);

​ formatter - - 格式化输出。

亮点:代码空格补全,小数位数控制

private Formatter f = new Formatter(System.out);

f.format(“%-20s %5s %10.2f”,name,class,price);

运行效果:

7F81676B-A63F-4CD2-84DE-DA31F0DB7301

正则表达式

什么是正则表达式

正则表达式是一种强大而灵活的文本处理工具,使用它,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。里面最难的是它的语法。

基础

”\" : 在Java中,两个反斜杠的意思就是,我要插入一个正则表达式的反斜杠。

如果要表示”可能有一个负号,后面跟着一位或者多为数字“,可以写成: -?\\d+

应用正则表达式的最简单的例子就是,String类的自带的matches(“正则表达式”)。

在正则表达式中,括号有着分组的效果,而竖直线 则表示或操作。
(- \\+)? :表示可能以一个加号或减号开头,也可以是两个都没有,因为后面有个问号。

String类还自带了一个非常有用的正则表达式工具,split()方法,功能是:将字符串从正则表达式匹配的地方切开。

当然,上面只是一些细节。举个真实的例子:写出一个正则表达式,判断以大写字母开头,句号结尾的句子。

String sen = "^[A-Z].*[\\.]$";

解析:正则表达式的开头都是以 “ ^ “ 符号,结尾是以 ” $ “符号。

但是在有些方法里面又不能加这个,比如String的split和replace里面。

创建正则表达式

字符:

屏幕快照 2017-07-22 下午5.00.35

字符类:

屏幕快照 2017-07-22 下午5.00.47

逻辑操作符和边界匹配符:

屏幕快照 2017-07-22 下午5.03.00

量词

量词描述了一个模式吸收文本的方式:

  • 贪婪型:会为所有可能的模式发现尽可能多的匹配;
  • 勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数;
  • 占有性:当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败时可以回溯;用于防止正则表达式失控。

Pattern和Matcher

​ String类自带的正则表达式的匹配,功能不够强大。要构造功能强大的正则表达式对象,我们需要导入java.util.regex包,然后用static Pattern.compile()方法来编译你的正则表达式即可。

用法:

Pattern p = Pattern.compile(“正则表达式”);

Matcher m = p.matcher(xxx);

说明:Pattern对象表示编译后的正则表达式,使用已编译好的Pattern对象上的matcher()方法,传入一个字符串,从而构造了一个Matcher对象。

匹配完成之后还有start() 和 end() 方法,start方法用于返回先前匹配的起始位置的索引,而end返回所匹配的最后一个字符加一的值。

split

String的一个内置方法,用于将一个字符串断开成字符串对象数组,至于从哪里断开,由正则表达式来确定

replace

正则表达式特别便于替换文本,提供了很多方法,比如replaceFirst(xxx)

reset

通过reset方法,可以将一个现有的matcher对象应用于一个新的字符序列;

使用不带参数的reset方法,可以将matcher对象重新设置到当前字符序列的起始位置。

正则表达式与Java I/O

正则表达式在一个文件中能进行搜索匹配操作。

扫描输入

​ 在以前,要处理文本数据是一件非常痛苦的事情。一般的解决方法就是读入一行文本,然后按照某个字符或者字符串对其进行分词。然后再解析。

​ 在Java5中新增了Scanner类,可以大大减轻扫描输入的工作负担。主要体现在可以直接用 nextInt()、nextDouble()之类的方法。Scanner的构造器可以接受任何类型的输入对象,包括File对象、InputStream、String等

​ 在默认情况下,Scanner根据空白字符对输入进行分词,但是你可以用正则表达式指定自己所需要的定界符。

Scanner s = ne wScanner(“12,42,78,99,42”);

s.useDelimiter(“\s,\s);

//输出数字,而且中间没有逗号

StringTokenizer

​ 在Java引入正则表达式(1.4)和Scanner类(1.5)之前,分割字符串唯一的方法就是使用StringTokenizer。这个使用起来比较麻烦,已经完全抛弃不用了。


Comments

评论功能暂停使用,如需跟作者讨论请联系底部的GitHub