字符串(5):正则表达式(下)

五、split()

    split()方法将输入字符串断开成字符串对象数组,断开边界由下列正则表达式确定:

String[] split(CharSequence input);
String[] split(CharSequence input, int limit);

    这是一个快速而方便的方法,可以按照通用边界断开输入文本:

import java.util.Arrays;
import java.util.regex.Pattern;

public class SplitDemo {
	public static void main(String[] args) {
		String input = "This!!unusual user!!of exclamation!!points";
		String[] split = Pattern.compile("!!").split(input);
		System.out.println(Arrays.toString(split));
		String[] split2 = Pattern.compile("!!").split(input, 3);
		System.out.println(Arrays.toString(split2));
	}
}

    第二种形式的split()方法可以限制将输入分隔成字符串的数量。

六、替换操作

    正则表达式特别便于替换文本,它提供了许多方法:replaceFirst(String replacement)以参数字符串replacement替换掉第一个匹配成功的部分。replaceAll(String replacement)以参数字符串replacement替换所有匹配成功的部分。appendReplacement(StringBuffer sbuf, String replacement)执行渐进式替换,而不是像replaceFirst()和replaceAll()那样只替换第一个匹配或全部匹配。这是一个非常重要的方法。它允许你调用其他方法来生成或处理replacement(replaceFirst()和replaceAll()则只能使用一个固定的字符串),使你能够以编程的方式将目标分割成组,从而具备更强大的替换功能。appendTail(StringBuffer sbuf),在执行了一次或多次appendReplacement()之后,调用此方法可以将输入字符串余下部分复制到sbuf中。

    下面的程序演示了如何使用这些替换方法:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TheReplacements {
	public static void main(String[] args) {
		String s = "AB!CD!EF!GH!IJ!K";
		System.out.println(s.replaceFirst("\\W", "@"));
		System.out.println(s.replaceAll("\\W", "@"));
		Matcher matcher = Pattern.compile("\\W").matcher(s);
		StringBuffer sbuf = new StringBuffer();
		while (matcher.find())
			matcher.appendReplacement(sbuf, "%");
		matcher.appendTail(sbuf);
		System.out.println(sbuf);
	}
}

    前两个替换方法使用的是String对象自带的方法,在这里,使用此方法更方便。注意,如果只使用一次替换,与其编译为Pattern,不如直接使用String的替换方法,而且开销也小一些。

    ReplaceFirst()只对找到的第一个匹配进行替换。此外,replaceFirst()和replaceAll()方法用来替换的只是普通的字符串,所以,如果想对这些替换字符串执行某些特殊处理,这两个方法是无法胜任的。如果你想这么做,就应该使用appendReplacement()方法。该方法允许你在执行替换的过程中,操作用来替换的字符串。在这个例子中,先构造sbuf用来保存最终结果,然后用group选择一个组,对其进行处理,将正则表达式的非词字符替换成%。一般情况下,你应该遍历执行所有的操作,然后在调用appendTail()方法,但是,如果你想模拟replaceFirst(替换n次)的行为,那就只需执行一次替换,然后调用appendTail(),将剩余未处理部分存入sbuf即可。

七、reset()

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

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Resetting {
	public static void main(String[] args) {
		Matcher m = Pattern.compile("[frb][aiu][gx]").matcher("fix the rug with bags");
		while (m.find())
			System.out.print(m.group() + " ");
		System.out.println();
		m.reset("fix the rig with rags");
		while (m.find())
			System.out.print(m.group() + " ");
	}
}

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

如果本文对您有很大的帮助,还请点赞关注一下。

发布了112 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40298351/article/details/104626449