赞
踩
String 是不可变的,String 类中每一个看起来会修改 String 值的方法,实际上都是创建了一个全新的 String 对象,以包含修改后的字符串内容。而最初的 String 对象则丝毫未动。
对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己的。
使用StringBuilder的相关操作会更好,+内部也会使用StringBuilder
如果你真的想要打印对象的内存地址,应该调用 Object.toString() 方法,这才是负责此任务的方法。所以,不要使用 this,而是应该调用 super.toString() 方法。this 会调用该类的toString(),造成循环调用。
方法 | 作用 |
---|---|
构造方法 | 创建String对象 |
getChars,getBytes | 复制char或byte到一个目标数组中 |
toCharArray | 生成一个char[],包含String中的所有字符 |
equals,equalsIgnoreCase | 比较两个String的内容是否相同。如果相同,结果为true |
compareTo,compareToIgnoreCase | 按词典顺序比较String的内容,比较结果为负数、零或正数。 |
contentEquals | 如果该String对象与参数的内容完全一致,则返回true |
contains | 如果该String对象包含参数的内容,则返回true |
regionMatches | 返回boolean结果,以表明所比较区域是否相等 |
startsWith,endsWith | 判断前后缀 |
indexOf,lastIndexOf | 如果该String并不包含此参数,就返回-1;否则返回此参数在String中的起始索引。lastIndexOf()是从后往前搜索 |
matches | 返回boolean结果,以表明该String和给出的正则表达式是否匹配 |
split | 按照正则表达式拆分String,返回一个结果数组 |
join | 用分隔符拼接字符片段,产生一个新的String |
substring | 返回一个新的String对象,以包含参数指定的子串 |
concat | 返回一个新的String对象,内容为原始String连接上参数String |
replace,replaceFirst, replaceAll | 替换 |
trim | 去掉了所有前后空格后的字符串,其中空格定义为codepoint小于或等于’U+0020’(空格字符)的任何字符。 |
构建格式 | 匹配的内容 |
---|---|
x | 字符x |
\\ | 反斜杠 |
\xhh | 十六进制值为0xhh的字符 |
\uhhhh | 十六进制表现为0xhhhh的字符 |
\N{name} | Unicode名为’name’的字符 |
\t | 水平制表符(’\u0009’) |
\n | 换行字符(‘\u000A’) |
\r | 回车符(‘\u000D’) |
\f | 换页符(’\u000C’) |
\e | 转义符(’\u001B’) |
构建格式 | 匹配的内容 |
---|---|
[abc] | 包含a,b或c的字符 |
[^abc] | 不包含a,b或c的任意字符(否定) |
[a-zA-Z] | a-z或A-Z之间的字符(范围),该式子表示匹配任意英文字母 |
[a-b[m-p]] | a-b或m-p之间的字符(联合),也可以写成[a-bm-p] |
[a-z&&[def]] | d,e或f |
[a-z&&[^bc]] | 等价于ad-z |
[a-z&&[^m-p]] | 等价于[a-lq-z] |
预定义字符 | 匹配 |
---|---|
. | 任意字符 |
\d | 数字:[0-9] |
\D | 非数字:[^0-9] |
\h | 水平空白符:[ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000] |
\H | 非水平空白符:[^\h] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符: [^\s] |
\v | 垂直空白字符: [\n\x0B\f\r\x85\u2028\u2029] |
\V | 非垂直空白符:[^\v] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
逻辑操作符 | 含义 |
---|---|
XY | Y跟在X后面 |
X|Y | X或者Y |
(X) | 捕获组(capturing group)。可以在表达式中用\i引用第i个捕获组 |
边界匹配 | 含义 |
---|---|
^ | 匹配行的开始 |
$ | 匹配行的结束 |
\b | 单词边界 |
\B | 边界单词 |
\G | 前一个匹配结束 |
\A | 输入的开始 |
\z | 输入的结束 |
\Z | The end of the input but for the final terminator, if any |
贪婪型 | 勉强型 | 占有型 | 匹配 |
---|---|---|---|
X? | X?? | X?+ | 0个或1个X |
X* | X*? | X*+ | 0个或多个X |
X+ | X+? | X++ | 1个或多个X |
X{n}? | X{n}?? | X{n}++ | 恰好匹配n次X |
X{n,}? | X{n,}?? | X{n,}++ | 至少匹配n次X |
X{n,n}? | X{n,n}?? | X{n,n}++ | 至少匹配n次,至多匹配m次X |
表达式 X 通常必须要用圆括号括起来,以便它能够按照我们期望的效果去执行。
Pattern pattern = Pattern.compile("regex",[flag]);
Matcher matcher = pattern.matcher(pattern);
方法 | ||
---|---|---|
matches | 尝试根据模式匹配整个输入序列 | |
lookingAt | 尝试根据模式匹配输入序列(从开头开始),它不需要匹配整个区域 | |
find | 尝试查找与该模式匹配的输入序列的下一个子序列 | find()、find(int) |
start | 返回上一个匹配的起始索引 | start()、start(int)、start(string) |
end | 返回上一个匹配的结束索引+1 | end()、end(int)、end(string) |
组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为 0 表示整个表达式,组号 1 表示被第一对括号括起来的组,以此类推。
方法 | |
---|---|
groupCount() | 返回该匹配器的模式中的分组数目,组 0 不包括在内。 |
group() | 返回前一次匹配操作(例如 find())的第 0 组(整个匹配) |
group(int) | 返回前一次匹配操作期间指定的组号,如果匹配成功,但是指定的组没有匹配输入字符串的任何部分,则将返回 null。 |
UNIX_LINES (?d) | 在这种模式下,在.、^和$的行为中,只识别行终止符\n。 也可以通过嵌入的标志表达式(?d)启用。 |
CASE_INSENSITIVE(?i) | 默认情况下,大小写不敏感的匹配假定只有US-ASCII字符集中的字符才能进行。这个标记允许模式匹配不考虑大小写(大写或小写)。通过指定UNICODE_CASE标记及结合此标记。基于Unicode的大小写不敏感的匹配就可以开启了 |
UNICODE_CASE(?u) | 当指定这个标记,并且开启CASE_INSENSITIVE时,大小写不敏感的匹配将按照与Unicode标准相一致的方式进行。默认情况下,大小写不敏感的匹配假定只能在US-ASCII字符集中的字符才能进行 |
COMMENTS(?x) | 在这种模式下,空格符将被忽略掉,并且以#开始直到行末的注释也会被忽略掉。通过嵌入的标记表达式也可以开启Unix的行模式 |
MULTILINE(?m) | 在多行模式下,表达式^和 分 别 匹 配 一 行 的 开 始 和 结 束 。 还 匹 配 输 入 字 符 串 的 开 始 , 而 分别匹配一行的开始和结束。^还匹配输入字符串的开始,而 分别匹配一行的开始和结束。还匹配输入字符串的开始,而还匹配输入字符串的结尾。默认情况下,这些表达式仅匹配输入的完整字符串的开始和结束 |
LITERAL | 当指定此标志时,指定模式的输入字符串将被视为文字字符序列。输入序列中的元字符或转义序列没有特殊意义。当将CASE_INSENSITIVE和UNICODE_CASE标志与该标志一起使用时,它们对匹配的影响仍然存在。其他的标志则变得多余。 |
DOTALL(?s) | 在dotall模式下,表达式.匹配所有字符,包括行终止符。默认情况下,.不会匹配行终止符 |
CANON_EQ | 当且仅当两个字符的完全规范分解相匹配时,才认为它们是匹配的。例如,如果我们指定这个标记,表达式\u003F就会匹配字符串?。默认情况下,匹配不考虑规范的等价性 |
split()方法将输入 String 断开成 String 对象数组,断开边界由正则表达式确定
String[] split(CharSequence input)
String[] split(CharSequence input, int limit)
使用正则表达式替换文本非常方便。
import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.*; import java.nio.file.*; /*! Here's a block of text to use as input to the regular expression matcher. Note that we first extract the block of text by looking for the special delimiters, then process the extracted block. !*/ public class TheReplacements { public static void main(String[] args) throws Exception { String s = Files.lines(Paths.get("TheReplacements.java")).collect(Collectors.joining("\n")); //匹配上面的注释,需要打开dotall模式 Matcher mInput = Pattern.compile("/\\*!(.*)!\\*/",Pattern.DOTALL).matcher(s); if (mInput.find()) { //返回第一个捕获组,及时上面表达式中(.*)匹配到的内容 s = mInput.group(1); } //将两个或两个以上的空格替换为一个空格 s = s.replaceAll(" {2,}", " "); //把每一行开头的空格去掉,需要打开多行模式 s = s.replaceAll("(?m)^ +", ""); System.out.println(s); s = s.replaceFirst("[aeiou]", "(VOWEL1)"); StringBuffer sbuf = new StringBuffer(); Pattern p = Pattern.compile("[aeiou]"); Matcher m = p.matcher(s); //把元音字母大写 while (m.find()) { m.appendReplacement(sbuf, m.group().toUpperCase()); } m.appendTail(sbuf); System.out.println(sbuf); } }
输出结果:
Here’s a block of text to use as input to
the regular expression matcher. Note that we
first extract the block of text by looking for
the special delimiters, then process the
extracted block.
H(VOWEL1)rE’s A blOck Of tExt tO UsE As InpUt tO
thE rEgUlAr ExprEssIOn mAtchEr. NOtE thAt wE
fIrst ExtrAct thE blOck Of tExt by lOOkIng fOr
thE spEcIAl dElImItErs, thEn prOcEss thE
ExtrActEd blOck.
通过 reset() 方法,可以将现有的 Matcher 对象应用于一个新的字符序列
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。