正则表达式 java ( 用于匹配、查找、替换和提取字符串。)

2,493 阅读3分钟

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);
    }