任何信息,基本都是以文字的形式传播和记录下来的。
在计算机中,文字就是字符的集合,也就是字符串,C就是因为对字符串设计的不好,才那么容易溢出。而别的一些高级语言,对于这个进行了很多的改进。
编程的人由于技术方向和应用方向的不同,日常编程的内容差距很大。但是对于字符串的处理,那可是永远都避不开的工作。
昨天跑步的时候,想了一下,对于字符串的操作有那么多(search,match,split,replace),感觉很烦杂,能不能抓住这些操作的一个基本集?
不知道对不对,反正想出来了一个,这个基本操作就是search,这里的search的意思是:在输入串中找到目标串的开始位置(start index),和结束位置(end index)。
有了这个基本集,别的操作都很好衍生出来:
局部match:其实就是要求search操作至少返回一个start index。
全match:其实要求search操作的至少返回一个start index,并且start index要为零,end index要为输入串的全长。
split:其实就是search操作之后,把前一个end index和当前的start index之间的字符串截出来而已。
replace:其实就是search操作之后,把start index和end index之间的字符串换成另外的而已。
所以,归根到底,都是一个search操作的拓展罢了。这么一想,感觉清晰多了。
这么一来,API对search的能力支持的好坏和效率高低是衡量字符串操作功能的标准,当然,如果有直接支持match,split,replace操作的话就更好了。
java对字符串search的支持,最基本的就是下面的String的indexOf方法:
int indexOf(String str)
Returns the index within this string of the first occurrence of the specified substring.
这里我想说的是,很多时候我们所谓要search的目标串,根本就不是固定单一的,而是变化多样的。如果只有一两种情况,最多用两次上面的方法呗。但是有些情况是近乎不可能罗列的,例如,我们讲的代表email的字符串,我们不可能遍历它吧。
所以,需要一种能够通用表达字符串格式的语言。这就是Regular Expression(re)。
假如上面方法indexOf的str参数能支持re做为参数的话,那对于这种多样的search也可以用上面的方法了。
可惜,indexOf不支持re作为参数。
so,以下就介绍java api中可以用re作为参数的字符串操作方法(参数中的regex就是re)。
--------------------->>
String类的:
全match操作:
boolean matches(String regex)
Tells whether or not this string matches the given regular expression.
全replace操作:
String replaceAll(String regex, String replacement)
Replaces each substring of this string that matches the given regular expression with the given replacement.
首个replace操作:
String replaceFirst(String regex, String replacement)
Replaces the first substring of this string that matches the given regular expression with the given replacement.
全split操作:
String[] split(String regex)
Splits this string around matches of the given regular expression.
有限制数的split操作:
String[] split(String regex, int limit)
Splits this string around matches of the given regular expression.
<<---------------------
可惜啊,可惜,可惜java的String类里面没有可以支持re的search方法,那如果要用re来search,只好使用java中专门的re类库。
java中的re类库主要就两个类,一个叫Pattern,顾名思义,代表re的类。一个叫Matcher类,反映当前match状况的类(如存放了当前search到的位置,匹配的字符串等等信息)。
一般在构造中,“re的表达式”作为参数传递入Pattern类,“输入串(待过滤串)”作为参数传递入Matcher类。
然后使用Matcher类的字符串search方法就可以了。Matcher真正提供search功能的API叫find。下面列出。
--------------------->>
Matcher类search操作相关的方法:
boolean lookingAt()
Attempts to match the input sequence, starting at the beginning, against the pattern.
boolean matches()
Attempts to match the entire input sequence against the pattern.
boolean find()
Attempts to find the next subsequence of the input sequence that matches the pattern.
String group()
Returns the input subsequence matched by the previous match.
<<---------------------
前三个都是search方法,返回成功与否。第四个是返回当前search上的字符串。
ok,至此。使用re的search操作也有眉目了。
当然,Pattern和Matcher也包含直接使用re进行的match,split,replace操作。
--------------------->>
Patter类别的字符串操作方法
全match操作:
static boolean matches(String regex, CharSequence input)
Compiles the given regular expression and attempts to match the given input against it.
全split操作:
String[] split(CharSequence input)
Splits the given input sequence around matches of this pattern.
有限制数的split操作:
String[] split(CharSequence input, int limit)
Splits the given input sequence around matches of this pattern.
Matcher类别的字符串操作方法
全replace操作:
String replaceAll(String replacement)
Replaces every subsequence of the input sequence that matches the pattern with the given replacement string.
首个replace操作:
String replaceFirst(String replacement)
Replaces the first subsequence of the input sequence that matches the pattern with the given replacement string.
动态replace(replacement可以根据被替代的字符串变化而变化)
Matcher appendReplacement(StringBuffer sb, String replacement)
Implements a non-terminal append-and-replace step.
StringBuffer appendTail(StringBuffer sb)
Implements a terminal append-and-replace step.
<<---------------------
总结:
当必须使用re的时候,search操作就要用到Pattern,Matcher,当然动态的replace操作也要用到这两个类。而别的match,replace,split操作,可以使用pattern,Matcher,当然也可以直接使用String,推荐还是用回咱们的String吧。
注:以上都是看jdk1.4以上的文档得出的结论,以前版本不能用不负责任。