Java 正则表达式
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
Java 正则表达式和 Perl 的是最为相似的。
java.util.regex 包主要包括以下三个类:
应用场景
-
匹配和验证文本
:正则表达式可以用于验证和匹配文本,例如电子邮件地址、电话号码、网址等。通过使用正则表达式,可以快速准确地确定字符串是否符合特定的格式要求。 -
搜索和替换文本
:正则表达式可以用于搜索和替换文本中的特定模式。例如,可以使用正则表达式搜索包含特定关键字的文件或文本,并将其替换为其他内容。 -
数据提取
:正则表达式可以用于从文本中提取特定的数据,例如从网页中提取电子邮件地址、电话号码等。通过使用正则表达式,可以快速准确地提取所需的数据。 -
自动化处理
:正则表达式可以用于自动化处理文本,例如自动生成代码、批量更改文件名、批量处理数据等。
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
正则匹配规则 元素
-- ^表示匹配字符串的开头,$表示匹配字符串的结尾。使用^和$可以确保正则表达式只匹配完全符合要求的字符串,而不是匹配字符串中的某个子串。
-- \\d, 只能匹配一个数字;
-- \\w, 只能匹配一个字母(或下划线或数字)
-- * 表示多次匹配: >=0 "123".matches("\d*") //true
-- + 表示一到多次匹配: >=1 "a12".matches("\\w+") // true
-- ? 表示0或一次匹配: 0 or 1 "12".matches("\\w?12")//true
匹配 企业编号: "corpNo":"(.*?)"
示例:
private final static String CORP_MATCH_POSTFIX_STR = ":"(.*?)"";
private final static String CORPNO_MATCH_STRS ="corpNo";
private static List<Pattern> corpNoPatterns = Lists.newArrayList();
static {
corpNoPatterns.add(Pattern.compile(""" + corpNoMatchStr + """ + CORP_MATCH_POSTFIX_STR));
}
String[] corpInfoArr = matchCorpInfoByRegex(paramJson);
if (StringUtils.isNotBlank(corpInfoArr[0])) {
corpNo = corpInfoArr[0];
break;
}
/**
* 正则匹配企业信息
*
* @param text
* @return
*/
public static String[] matchCorpInfoByRegex(String text) {
String corpNo = "";
for (Pattern corpNoPattern : corpNoPatterns) {
Matcher matcher = corpNoPattern.matcher(text);
while (matcher.find()) {
corpNo = matcher.group(1);
}
if (!isStringParamNotLegal(corpNo)) {
break;
}
}
return new String[]{corpNo};
}
匹配是否包含中文
private final static Pattern P = Pattern.compile("[\u4e00-\u9fa5]");
/**
* 判断字符串中是否包含中文
*
* @param str 待校验字符串
* @return 是否为中文
* @warn 不能校验是否为中文标点符号
*/
public static boolean isContainChinese(String str) {
Matcher m = P.matcher(str);
if (m.find()) {
return true;
}
return false;
}
过滤中文
/**
* 过滤掉中文
*
* @param str 待过滤中文的字符串
* @return 过滤掉中文后字符串
*/
public static String filterChinese(String str) {
// 用于返回结果
String result = str;
boolean flag = isContainChinese(str);
if (flag) {// 包含中文
// 用于拼接过滤中文后的字符
StringBuffer sb = new StringBuffer();
// 用于校验是否为中文
boolean flag2 = false;
// 用于临时存储单字符
char chinese = 0;
// 5.去除掉文件名中的中文
// 将字符串转换成char[]
char[] charArray = str.toCharArray();
// 过滤到中文及中文字符
for (int i = 0; i < charArray.length; i++) {
chinese = charArray[i];
flag2 = isChinese(chinese);
if (!flag2) {// 不是中日韩文字及标点符号
sb.append(chinese);
}
}
result = sb.toString();
}
return result;
}
/**
* 判定输入的是否是汉字
*
* @param c 被校验的字符
* @return true代表是汉字
*/
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
匹配 {}
public static void main( String[] args ){
// 按指定模式在字符串查找
String line = "{"a":"${b}+${c}"}";
String pattern = "\\$\\{([^}]*)\\}";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
while (m.find()) {
//System.out.println(m.group());
String variableStr = m.group().substring(2).substring(0, m.group().length() - 3);//去掉 ${}
System.out.println(variableStr);
}