📄 regexexpression.java
字号:
package book.string.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* jdk1.4中加入了java.util.regex包提供对正则表达式的支持。
* 而且Java.lang.String类中的replaceAll和split函数也是调用的正则表达式来实现的。
*/
public class RegexExpression {
/**
* 利用正则表达式查找匹配字符串
*/
public static void testFind() {
// ^符号匹配字符串的开头
// 匹配以abc开头的字符串
RegexExpression.find("abcdef", "^abc");
RegexExpression.find("Aabc def", "^abc");
System.out.println();
// $符号匹配字符串的结尾
// 匹配以def结尾的字符串
RegexExpression.find("Aabcdef", "def$");
RegexExpression.find("AabcdeF", "def$");
// 如果同时使用^符号和$符号,将进行精确匹配
RegexExpression.find("def", "^def$");
RegexExpression.find("abcdefg", "^def$");
System.out.println();
// *符号匹配0个或多个前面的字符
RegexExpression.find("a", "ab*");
RegexExpression.find("ab", "ab*");
RegexExpression.find("abbb", "ab*");
System.out.println();
// +符号匹配至少一个前面的字符
RegexExpression.find("a", "ab+");
RegexExpression.find("ab", "ab+");
RegexExpression.find("abbb", "ab+");
System.out.println();
// ?符号匹配0个或1个前面的字符
RegexExpression.find("a", "ab?c?");
RegexExpression.find("ab", "ab?c?");
RegexExpression.find("abc", "ab?c?");
RegexExpression.find("abbcb", "ab?c?");
System.out.println();
// .符号匹配除换行符以外的任何字符,
RegexExpression.find("a", ".");
// .与+连用能匹配除换行符以外的所有字符串
RegexExpression.find("dasf4566a`1345=-=4bsd", ".+");
System.out.println();
// x|y匹配"x"或"y"
// abc|xyz 可匹配 "abc"或 "xyz",而"ab(c|x)yz"匹配 "abcyz"和"abxyz"
RegexExpression.find("x", "x|y");
RegexExpression.find("y", "x|y");
RegexExpression.find("abc", "abc|xyz");
RegexExpression.find("xyz", "abc|xyz");
RegexExpression.find("abc", "ab(c|x)yz");
RegexExpression.find("abcyz", "ab(c|x)yz");
System.out.println();
// {n}匹配恰好n次(n为非负整数)前面的字符
RegexExpression.find("aa", "a{3}");
RegexExpression.find("aaa", "a{3}");
System.out.println();
// {n,}匹配至少n次(n为非负整数)前面的字符
RegexExpression.find("aaa", "a{3,}");
RegexExpression.find("aaaaa", "a{3,}");
System.out.println();
// {m,n}匹配至少m个,至多n个前面的字符
RegexExpression.find("aaa", "a{3,4}");
RegexExpression.find("aaaa", "a{3,4}");
RegexExpression.find("aaaaa", "a{3,4}");
System.out.println();
// [xyz]表示一个字符集,匹配括号中字符的其中之一
RegexExpression.find("a", "[abc]");
RegexExpression.find("b", "[abc]");
RegexExpression.find("c", "[abc]");
RegexExpression.find("ab", "[abc]");
System.out.println();
// [^xyz]表示一个否定的字符集。匹配不在此括号中的任何字符
RegexExpression.find("a", "[^abc]");
RegexExpression.find("x", "[^abc]");
RegexExpression.find("8", "[^abc]");
System.out.println();
// [a-z]匹配从"a"到"z"之间的任何一个小写字母字符
RegexExpression.find("c", "[b-d]");
RegexExpression.find("f", "[b-d]");
RegexExpression.find("$", "[b-d]");
System.out.println();
// [^a-z]表示某个范围之外的字符,匹配不在指定范围内的字符
RegexExpression.find("f", "[b-d]");
RegexExpression.find("b", "[b-d]");
System.out.println();
// [a-zA-Z] a到z或A到Z
RegexExpression.find("B", "[a-cA-F]");
RegexExpression.find("G", "[a-cA-F]");
System.out.println();
// [a-z-[bc]] a到z,除了b和c
RegexExpression.find("c", "[a-z-[bcd]]");
RegexExpression.find("e", "[a-z-[bcd]]");
RegexExpression.find("f", "[a-z-[e-x]]");
System.out.println();
// 特殊字符,\n换行符;\f分页符;\r回车;\t制表符
RegexExpression.find("\n", "\n");
RegexExpression.find("\f", "\f");
RegexExpression.find("\r", "\r");
RegexExpression.find("\t", "\t");
System.out.println();
// \\表示转义符\,在使用时要用\\\\代表\\,\\代表\。
RegexExpression.find("\\", "\\\\");
System.out.println();
// \s 任何白字符,包括空格、制表符、分页符等。等价于"[\f\n\r\t]"
// 使用\s时前面再加一个\
RegexExpression.find("\n", "\\s");
RegexExpression.find("\f", "\\s");
RegexExpression.find("\r", "\\s");
RegexExpression.find("\t", "\\s");
System.out.println();
// \S 任何非空白的字符。等价于"[^\f\n\r\t]"
// 使用\s时前面再加一个\
RegexExpression.find("\n", "\\S");
RegexExpression.find("\f", "\\S");
RegexExpression.find("a", "\\S");
RegexExpression.find("9", "\\S");
System.out.println();
// \w 任何单词字符,包括字母和下划线。等价于"[A-Za-z0-9_]"
// 使用时用\\w
RegexExpression.find("a", "\\w");
RegexExpression.find("9", "\\w");
RegexExpression.find("X", "\\w");
RegexExpression.find("_", "\\w");
System.out.println();
// \W 任何非单词字符。等价于"[^A-Za-z0-9_]"
// 使用时用\\W
RegexExpression.find("a", "\\W");
RegexExpression.find("9", "\\W");
RegexExpression.find("$", "\\W");
RegexExpression.find("#", "\\W");
System.out.println();
// \d匹配一个数字字符,等价于[0-9]
RegexExpression.find("6", "\\d");
RegexExpression.find("9", "\\d");
RegexExpression.find("A", "\\d");
System.out.println();
// \D匹配一个非数字字符,等价于[^0-9]
RegexExpression.find("%", "\\D");
RegexExpression.find("$", "\\D");
RegexExpression.find("A", "\\D");
RegexExpression.find("8", "\\D");
System.out.println();
// \b匹配单词的结尾
RegexExpression.find("love", "ve\\b");
RegexExpression.find("very", "ve\\b");
System.out.println();
// \B匹配单词的开头
RegexExpression.find("love", "ve\\B");
RegexExpression.find("very", "ve\\B");
System.out.println();
}
/**
* 利用正则表达式查找匹配字符串。
* @param str 待匹配的字符串
* @param regex 正则表达式
* @return
*/
public static boolean find(String str, String regex) {
// 将正则表达式编译成一个Pattern
Pattern p = Pattern.compile(regex);
// 创建一个Matcher
Matcher m = p.matcher(str);
// Matcher的find方法用来查找或者匹配,只要能找到满足正则表达式的子串,就返回true
boolean b = m.find();
System.out.println("\"" + str + "\" 匹配正则表达式 \"" + regex + "\" ? " + b);
return b;
}
/**
* 测试利用正则表达式 精确匹配 字符串
*/
public static void testMatch() {
RegexExpression.match("abcdef", "^abc");
RegexExpression.match("Aabc def", "^abc");
RegexExpression.match("Aabcdef", "def$");
RegexExpression.match("AabcdeF", "def$");
RegexExpression.match("def", "^def$");
}
/**
* 精确匹配字符串和正则表达式,所谓精确匹配是字符串的每个字符都满足正则表达式
* @param str
* @param regex
* @return
*/
public static boolean match(String str, String regex) {
// 将正则表达式编译成一个Pattern
Pattern p = Pattern.compile(regex);
// 创建一个Matcher
Matcher m = p.matcher(str);
boolean b = m.matches();// 精确匹配
System.out.println("\"" + str + "\" 精确匹配正则表达式 \"" + regex + "\" ? "
+ b);
return b;
}
/**
* 测试利用正则表达式替换字符串
*/
public static void testReplace() {
// 将字符串中重复的空格替换为一个空格
RegexExpression.replace("a a a a", " {2,}", " ");
RegexExpression.replace("abcad a", "a", "x");
}
/**
* 利用正则表达式替换字符串
* @param str 待替换的字符串
* @param regex 正则表达式
* @param newStr 用来替换的字符串
* @return
*/
public static String replace(String str, String regex, String newStr) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
// 用新串替换所有满足正则表达式的子串
String s = m.replaceAll(newStr);
System.out.println("\"" + str + "\" 中匹配正则表达式 \"" + regex + "\" 部分被 \""
+ newStr + "\" 替换后: " + s);
return s;
}
/**
* 利用正则表达式分割字符串
*/
public static void testSplit() {
// 按空格分割字符串,空格符可以是连续的多个。
System.out.println("RegexExpression.split(\"ab aba a bbc bc\", \" +\", 5): result");
RegexExpression.outputStrArray(RegexExpression.split(
"ab aba a bbc bc", " +", 5));
// 按照字母b分割字符串
System.out
.println("RegexExpression.split(\"ab aba a bbc bc\", \"b\", 5): result");
RegexExpression.outputStrArray(RegexExpression.split(
"ab aba a bbc bc", "b", 5));
}
/**
* 使用正则表达式分割字符串
* @param str 待分割的字符串
* @param regex 正则表达式
* @param count 最终被分成的段数的最大值
* @return
*/
public static String[] split(String str, String regex, int count) {
Pattern p = Pattern.compile(regex);
// 按照符合正则表达式的子串分割字符串
return p.split(str, count);
}
/**
* 输出字符串数组
* @param array
*/
public static void outputStrArray(String[] array) {
if (array != null) {
for (int i = 0; i < array.length; i++) {
System.out.println(i + ": " + array[i]);
}
}
}
public static void main(String[] args) {
RegexExpression.testFind();
RegexExpression.testMatch();
System.out.println();
RegexExpression.testReplace();
System.out.println();
RegexExpression.testSplit();
System.out.println();
// 查找并替换, 替换换前2个满足正则表达式的子串
Pattern p = Pattern.compile("a+");
Matcher m = p.matcher("bba bb aaa bbabb bab");
StringBuffer sb = new StringBuffer();
int i = 0;
while ((m.find()) && (i < 2)) {
// 将字符串中的匹配的部分替换,
// 并且两次匹配之间(包括被匹配的部分)的字符串追加到sb后
m.appendReplacement(sb, "XX");
i++;
}
// 将字符串中没有进行匹配的部分全部追加到sb后面
m.appendTail(sb);
System.out.println(sb.toString());
}
/**
* 在程序中使用正则表达式的步骤一般如下: 1. 建立Pattern对象,通过静态方法Pattern.compile(); 2.
* 取得Matcher对象,通过pattern.matcher(CharSequence charSequence); 3.
* 调用Matcher对象的相关查找方法。
* java.lang.CharSequence接口是在JDK1.4版本中被添加进来的,它为不同种类的char序列
* 提供了统一的只读访问。实现的类有String, StringBuffer, java.nio.CharBuffer
* Matcher提供几个不同的查找方法,比String类的matches()方法更灵活,如下:
* match() 使用整个字符串与相关模式相比较,和String的matches()差不多
* lookingAt() 从字符串开头的地方与相关模式比较
* find() 匹配字符串,没有必要从字符串的第一个字符开始,如果前一个操作匹配, 而且匹配器没有重置的话,则从不匹配的第一个字符开始。
* 上面每个方法都返回boolean类型,返回true则意味的匹配,返回false则不匹配。
* 要检测给定的String是否匹配给定的模式,只须下面这样就可以了:
* Matcher m = Pattern.compile(yourPattern).matcher(yourString);
* if (m.find()) { System.out.println(“match”); } else {
* System.out.println(“no match”); }
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -