Java中转义字符反斜杠\的代替方法及repalceAll内涵解析

一、需求

现有一个字符串str

String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}";
System.out.println("str = " + str);

在控制台的输出为:

str = {\"name\":\"spy\",\"id\":\"123456\"}

目标:将str转化为标准的json格式串str1,以调用JsonUtil的方法,将字符串转为map。即目标str1为:

str1 = {"name":"spy","id":"123456"}

二、实现方法

1. 使用 StringEscapeUtils中的转义与反转义

apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils。利用它可方便地进行html、xml、java等的转义与反转义。

String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}";
System.out.println("原始 str = " + str);
String str1 = StringEscapeUtils.unescapeJava(str);
System.out.println("目标 str1 = " + str1);
//对应方法的StringEscapeUtils.escapeJava(str1);
//可将str1转义回str

控制台输出:

原始 str = {\"name\":\"spy\",\"id\":\"123456\"}
目标 str1 = {"name":"spy","id":"123456"}

2. 使用Java的replaceAll方法

String str1 = str.replaceAll("\\\\","");
//控制台str1的输出为:{"name":"spy","id":"123456"}

三、Java 的replaceAll 内涵解析

使用Java的replaceAll(String regex, String replacement)函数,即用replacement替换所有的regex匹配项,regex是一个正则表达式,replacement是字符串。

String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}";

(1)对于串str,Java将其进行转义,\\ 表示 \ ,\” 表示 ” ,故而在Java内存中即为:
{\”name\”:\”spy\”,\”id\”:\”123456\”},然而,我们的目标是 {“name”:”spy”,”id”:”123456”},即将转义字符 \ 替换为空。

(2)Java的replaceAll(String regex, String replacement)函数,第一个参数是一个正则表达式。在正则表达式中的“\”与后面紧跟的那个字符构成一个转义字符,代表着特殊的意义,比如”\n”表示换行符等。所以,如果要在正则表达式中表示一个反斜杠\,则应当用\\表达 。但参数regex 首先会经过Java的一次转义,若想表达两个反斜杠 \\,则需四个反斜杠。

综上所述:replaceAll 的第一个参数是正则表达式,故而要经过两次转义,一次Java、一次正则。因此就需要四个反斜杠才可以匹配一个反斜杠。故而,替换一个反斜杠为空的replaceAll的代码即为:

str1 = str.replaceAll("\\\\","");

四、补充说明

String的replaceAll 同Matcher.replaceAll. 如下是String的repalceAll的源码实现。

public String repalceAll(String expr,String substitute){
  return Pattern.compile(expr).matcher(this).replaceAll(substitute);
}

大家可以注意到Pattern.compile(expr)的参数是正则表达式。故而:

错误写法(运行报错):

String tmp = Pattern.compile("\\").matcher("h\\").replaceAll("ello");

正确写法:

String tmp = Pattern.compile("\\\\").matcher("h\\").replaceAll("ello");
//输出为hello

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java清除html转义字符

    复制代码 代码如下: import java.util.HashMap;import java.util.Map; import org.apache.commons.lang3.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * 静态文件处理的一些便捷服务 * @author Kettas * 4:27:25 PM */public class

  • Java正则表达式处理特殊字符转义的方法

    正则需要转义字符 '$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|' 异常现象: java.util.regex.PatternSyntaxException: Dangling meta. character '*' near index 0 解决方法 对特殊字符加\\转义即可. 注意:虽然使用[]在部分条件下也可以,但是在对于(.[.{范围边界开始符不匹配的情况下会报如下: 异常现象 java.util.

  • java中的转义字符介绍

    java中的转义字符有四种: JAVA中转义字符: 1.八进制转义序列: + 1到3位5数字:范围'00'~'377':空字符 2.Unicode转义字符:u + 四个十六进制数字:0~65535u0000:空字符 3.特殊字符:就3个":双引号':单引号\:反斜线 4.控制字符:5个 r 回车n 换行f 走纸换页t 横向跳格b 退格 使用这些转义字符的规则:普通的转义字符序列和八进制转义字符都比Unicode转义字符要好得多,因为与Unicode转义字符不同,转义字符序列是在程序被解析为各种符

  • 详解JAVA中转义字符

    本文主要介绍JAVA中转义字符,分享给大家.具体如下: 1.八进制转义序列:\ + 1到3位5数字:范围'\000'~'\377' \0:空字符 2.Unicode转义字符:\u + 四个十六进制数字:0~65535 \u0000:空字符 3.特殊字符:就3个 \":双引号  \':单引号  \\:反斜线 4.控制字符:5个 \' 单引号字符 \\ 反斜杠字符 \r 回车 \n 换行 \f 走纸换页 \t 横向跳格 \b 退格 点的转义:. ==> u002E 美元符号的转义:$ ==&g

  • java中关于转义字符的一个bug

    在java中,你可以定义 char c = '\u4f60'; char m = '\u0045'; char e = '\u554a'; 这样的字面量,例如: System.out.println("\u535a\u5ba2\u56ed"); 这样的代码不管在什么编码环境下都不会出现中文乱码的问题 但是你不能定义这样的字面量: char c = '\u000a'; char m = '\u0027'; 这是因为\u000a和\u0027是特殊转义字符,Java对在字符串字面常量中的U

  • Java中转义字符反斜杠\的代替方法及repalceAll内涵解析

    一.需求 现有一个字符串str String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}"; System.out.println("str = " + str); 在控制台的输出为: str = {\"name\":\"spy\",\"id\":\&

  • 老生常谈java路径中的反斜杠和斜杠的区别

    JAVA中的斜杠 有正斜杠与反斜杠之分,正斜杠,一般就叫做斜杠,符号为"/":反斜杠的符号为"\". 斜杠(/)在JAVA中没有什么特别的意义,就是代表一个字符'/'; 反斜杠(\)则不然,它和紧跟着它的那个字符构成转义字符,如"\n"(换行)."\""(字符'"')等,所以在字符串中要表示字符'\'要用"\\"来表示,例:如果你这样定义一个字符串String s = "nam

  • PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠

    通过AJAX传到PHP的json字符串有时候加上反斜杠"\"来转义,PHP处理时需要先去掉反斜杠,然后再json_decode. $str = stripslashes($_POST['json']); $arr = json_decode($str,true); PS:php get抓取json怎样去除双引号前面的反斜杠 你这个不算标准的JSON格式数据,可以先将\"替换成"即可. 再用json_decode()系统函数将其转为json对象,如需转为数组加上第二个

  • Python3.6-MySql中插入文件路径,丢失反斜杠的解决方法

    如下所示: 如上图,replace即可. 以上这篇Python3.6-MySql中插入文件路径,丢失反斜杠的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • C#去除字符串中的反斜杠实例(推荐)

    如下,可以使用C#的Replace()方法来替换,但有一点需要注意的是backslash(反斜杠)是特殊字符. string s = "[\"aaaaaaaaaaaaaaaaaaaaaa\"]"; string ss = s.Replace("\\",""); Response.Write(ss); 以上这篇C#去除字符串中的反斜杠实例(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python中的反斜杠问题深入讲解

    前言 python本身使用 \ 来转义一些特殊字符,比如在字符串中加入引号的时候 s = 'i\'m superman' print(s) # i'm superman 为了防止和字符串本身的引号冲突,使用 \ 来转义,一般情况下这个也不会引起什么问题,但是当你要使用 \ 来转义 \ 的时候,就比较混乱了,比如我们想要输出一个 \ ,得写两个 \ ,否则会报语法错误,因为 \ 把后面的引号给转义了,必须使用 \ # 错误写法 # print '\' # 正确写法 print('\\') # \

  • Python字符串和正则表达式中的反斜杠('\')问题详解

    在Python普通字符串中 在Python中,我们用'\'来转义某些普通字符,使其成为特殊字符,比如 In [1]: print('abc\ndef') # '\n'具有换行的作用 abc defg In [2]: print('abc\tdef') # '\t'具有制位符的作用 abc defg 我们还可以用'\'来转义特殊字符,使其成为普通字符,比如 In [3]: print('abc\\tdef') # 使'\'成为一个普通的字符,没有转义作用 abc\tdef In [4]: prin

  • 关于通过Java连接mysql对反斜杠”\“转义的测试详解

    前言 在java中,反斜杠"\"转义是"\",因此表示一个"\"要使用"\\",如果是正则表达式,那么表示一个"\"需要用"\\\\",在mysql中,反斜杠转义依然是"\",和java相同. 现在问题是:如果mysql中一个字段的内容包含反斜杠,然后通过java连接mysql去筛选这个字段所在的条目,要怎么写才能将该字段筛选出来呢?下面就是一个实验: 1,先建立测试

  • python中的正斜杠与反斜杠实例验证

    目录 一.历史渊源 二.实例验证 三.总结 扩展:Python 基础篇-正斜杠("/")和反斜杠("\")的用法 一.历史渊源 UNIX操作系统:设计了使用 ‘/’ 的路径分割法 DOS系统:借鉴了UNIX的目录结构,但由于在DOS系统中,斜杠 ‘/’ 已经用来作为命令行参数的标志,因此只能使用反斜杠 ‘\’ Windows系统:很多时候已经没有命令行参数的干扰,因此正斜杠与反斜杠大多数情况下可以互换 二.实例验证 桌面新建临时Excel文件——test.xlsx,

  • python正则表达式 匹配反斜杠的操作方法

    python正则表达式 匹配反斜杠 正则 需要把原始字符串不被转义的条件下传递给正则模块,正则再去转义. r表示r后面的字符串为原始字符串,防止计算机将 \ 理解为转义字符. r'^\\$' 首先按照原始字符串给到compile函数 ,正则再把r'^\\$'中的\`翻译成\ backslash='\\' print(backslash) regular_backslash=re.compile(r'^\\$') print(regular_backslash.search(regular_bac

随机推荐