java正则表达式对特殊字符的转义以及异常现象

 更新时间:2023年06月29日 09:01:38   作者:胡八一  
这篇文章主要给大家介绍了关于java正则表达式对特殊字符的转义以及异常现象的相关资料,在Java中使用正则表达式匹配特殊字符也需要使用转义字符"\",需要的朋友可以参考下

正则表达式语法

在其他语言中,\\表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是\\\\

java正则表达式对特殊字符的转义

正则表达式会对一些特殊字符进行转义,主要有以下字符:

'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'

比如,正则表达式对特殊字符’ | ’ 的转义:

public static void main(String[] args) {
    String str = "a|b|c";
    // 错误示范
    // str.split("|");
    //
    // 正确的写法,应该在需要转义的字符前加上 "\\"
    String[] split = str.split("\\|");
    for (String s : split) {
        System.out.print(s + " "); // 控制台打印 a b c
    }
}

异常现象

正则需要转义字符:

'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'

异常现象: java.util.regex.PatternSyntaxException: Dangling meta. character '*' near index 0
解决方法: 对特殊字符加\转义即可。

注意:虽然使用[]在部分条件下也可以,但是在对于(、[、{范围边界开始符不匹配的情况下会报如下:
异常现象:java.util.regex.PatternSyntaxException: Illegal repetition near index 50

Java过滤正则表达式特殊字代码如下(注意:\需要第一个替换,否则replace方法替换时会有逻辑bug)

/**
 * 转义正则特殊字符 ($()*+.[]?\^{},|)
 * 
 * @param keyword
 * @return
 */
public static String escapeExprSpecialWord(String keyword) {
	if (StringUtils.isNotBlank(keyword)) {
		String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };
		for (String key : fbsArr) {
			if (keyword.contains(key)) {
				keyword = keyword.replace(key, "\\" + key);
			}
		}
	}
	return keyword;
}

实战

后台传回的网址:http://192.168.1.17:8096/detection-admin\video\2020\11\4\浙B99939\3604252011040004\浙B99939_1_PDASP_01.mp4

通过工具类转换:

    /**
     * @author Longchengbin
     * @description 将网址反斜杠转成正斜杠并将中文转为16进制字符
     * @since 2020-11-4 16:33
     **/
    public static String decode(String url) {
        String[] strings = url.split("\\\\");
        String s1 = strings[strings.length - 1];
        String s2 = strings[strings.length - 3];
        String s = "";
        try {
            //将反斜杠替换成正斜杠
            s = url.replaceAll("\\\\", "/").
                    //将中文转成16进制字符
                            replace(s1, URLEncoder.encode(s1, "utf-8")).replace(s2, URLEncoder.encode(s2, "utf-8"));
            LogUtils.w(s);
        } catch (UnsupportedEncodingException e) {
            LogUtils.e("网址转换报错:" + e.toString());
        }
        return s;
    }

转换后:

http://192.168.1.17:8096/detection-admin/video/2020/11/4/%E6%B5%99B99939/3604252011040004/%E6%B5%99B99939_1_PDASP_01.mp4

总结

到此这篇关于java正则表达式对特殊字符的转义以及异常现象的文章就介绍到这了,更多相关java正则对特殊字符转义内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中的@ResponseStatus使用

    Spring中的@ResponseStatus使用

    这篇文章主要介绍了Spring中的@ResponseStatus使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • ES结合java代码聚合查询详细示例

    ES结合java代码聚合查询详细示例

    es查询有一个很常用的一种叫聚合查询,相当于mysql中的分组group by 后拿各组数量进行统计,实现起来也是很简单,下面这篇文章主要给大家介绍了关于ES结合java代码聚合查询的相关资料,需要的朋友可以参考下
    2023-05-05
  • springboot基于IDEA环境热加载与热部署教程

    springboot基于IDEA环境热加载与热部署教程

    这篇文章主要为大家介绍了springboot在IDEA环境下的热加载与热部署教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • JAVA 深层拷贝 DeepCopy的使用详解

    JAVA 深层拷贝 DeepCopy的使用详解

    最近需要用到比较两个对象属性的变化,其中一个是oldObj,另外一个是newObj,oldObj是newObj的前一个状态,所以需要在newObj的某个状态时,复制一个一样的对象,由于JAVA不支持深层拷贝,因此专门写了一个方法
    2013-07-07
  • SpringBoot项目在启动后自动关闭的实现

    SpringBoot项目在启动后自动关闭的实现

    我们在写spring boot web项目时,有时会遇到启动后立即关闭的情况, 本文主要介绍了SpringBoot项目在启动后自动关闭的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Java语言中flush()函数作用及使用方法详解

    Java语言中flush()函数作用及使用方法详解

    这篇文章主要介绍了Java语言中flush函数作用及使用方法详解,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java的HashMap源码解析

    Java的HashMap源码解析

    这篇文章主要介绍了Java的HashMap源码解析,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对是一个Node,后台是用一个Node数组来存放数据,这个Node数组就是HashMap的主干,需要的朋友可以参考下
    2023-11-11
  • Spring Boot 中的 @HystrixCommand 注解原理及使用方法

    Spring Boot 中的 @HystrixCommand 注解原理及使用方法

    通过使用 @HystrixCommand 注解,我们可以轻松地实现对方法的隔离和监控,从而提高系统的可靠性和稳定性,本文介绍了Spring Boot 中的@HystrixCommand注解是什么,其原理以及如何使用,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • Java随机密码生成并和邮箱、手机号匹配

    Java随机密码生成并和邮箱、手机号匹配

    这篇文章主要介绍了Java随机密码生成并和邮箱、手机号匹配的相关资料,需要的朋友可以参考下
    2016-01-01
  • mybatis 事务回滚配置操作

    mybatis 事务回滚配置操作

    这篇文章主要介绍了mybatis 事务回滚配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论