java中String.replaceAll方法把换行符(\n)替换为明文显示(\n)或(\\n)

您所在的位置:网站首页 如何把换行去掉 java中String.replaceAll方法把换行符(\n)替换为明文显示(\n)或(\\n)

java中String.replaceAll方法把换行符(\n)替换为明文显示(\n)或(\\n)

2024-06-17 22:55:23| 来源: 网络整理| 查看: 265

 

 

最近需要解析一个JSONArray类型的字符串

[{"key":"姓名","value":"XX"},{"key":"资质","value":"从事贵金属投资行业10年 国家期货二级分析师 上金所荣誉长老"},{"key":"其他","value":""}]

在key资质对应的value中包含三条分行显示的信息,那么坑就来了,当JSON解析遇到\n(换行)就会抛出异常,那怎么办?  还好,想到了一个对策,就是使用java原生的String.replaceAll方法先把换行(\n)转换成能明文显示的\n(\\n)。

System.out.println(array.replaceAll("\n","\\n"));

结果发现,貌似不对劲,输出结果是这样的????

[{"key":"姓名","value":"XX"},{"key":"资质","value":"从事贵金属投资行业10年n国家期货二级分析师n上金所荣誉长老"},{"key":"其他","value":""}]

哇,有毒!怎么只剩下一个n了??  为了搞明白什么问题,百度、google?no,我们看源码。  先看一下replaceAll方法的源码

public String replaceAll(String replacement) { reset(); boolean result = find(); if (result) { StringBuffer sb = new StringBuffer(); do { appendReplacement(sb, replacement); result = find(); } while (result); appendTail(sb); return sb.toString(); } return text.toString(); }

从该方法中,我们可以看到,该方法中是一直循环直至find()返回false,每一次find匹配到换行(我们调用String.replaceAll时传入的匹配字符串是”\n”)都会执行appendReplacement方法,那么这个家伙到底做了什么呢?

public Matcher appendReplacement(StringBuffer sb, String replacement) { // If no match, return error if (first < 0) throw new IllegalStateException("No match available"); // Process substitution string to replace group references with groups int cursor = 0; StringBuilder result = new StringBuilder(); while (cursor < replacement.length()) { char nextChar = replacement.charAt(cursor); if (nextChar == '\\') { cursor++; nextChar = replacement.charAt(cursor); result.append(nextChar); cursor++; } else if (nextChar == '$') { // Skip past $ cursor++; // A StringIndexOutOfBoundsException is thrown if // this "$" is the last character in replacement // string in current implementation, a IAE might be // more appropriate. nextChar = replacement.charAt(cursor); int refNum = -1; if (nextChar == '{') { cursor++; StringBuilder gsb = new StringBuilder(); while (cursor < replacement.length()) { nextChar = replacement.charAt(cursor); if (ASCII.isLower(nextChar) || ASCII.isUpper(nextChar) || ASCII.isDigit(nextChar)) { gsb.append(nextChar); cursor++; } else { break; } } if (gsb.length() == 0) throw new IllegalArgumentException( "named capturing group has 0 length name"); if (nextChar != '}') throw new IllegalArgumentException( "named capturing group is missing trailing '}'"); String gname = gsb.toString(); if (ASCII.isDigit(gname.charAt(0))) throw new IllegalArgumentException( "capturing group name {" + gname + "} starts with digit character"); if (!parentPattern.namedGroups().containsKey(gname)) throw new IllegalArgumentException( "No group with name {" + gname + "}"); refNum = parentPattern.namedGroups().get(gname); cursor++; } else { // The first number is always a group refNum = (int)nextChar - '0'; if ((refNum < 0)||(refNum > 9)) throw new IllegalArgumentException( "Illegal group reference"); cursor++; // Capture the largest legal group string boolean done = false; while (!done) { if (cursor >= replacement.length()) { break; } int nextDigit = replacement.charAt(cursor) - '0'; if ((nextDigit < 0)||(nextDigit > 9)) { // not a number break; } int newRefNum = (refNum * 10) + nextDigit; if (groupCount() < newRefNum) { done = true; } else { refNum = newRefNum; cursor++; } } } // Append group if (start(refNum) != -1 && end(refNum) != -1) result.append(text, start(refNum), end(refNum)); } else { result.append(nextChar); cursor++; } } // Append the intervening text sb.append(text, lastAppendPosition, first); // Append the match substitution sb.append(result); lastAppendPosition = last; return this; }

分析该方法的实现,我们可以发现在while循环的第一行执行了

char nextChar = replacement.charAt(cursor);

获取替换目标字符串的第一个字符,我们这里是”\\n”,那么第一个字符就是’\’,然后看第一个if语句

if (nextChar == '\\') { cursor++; nextChar = replacement.charAt(cursor); result.append(nextChar); cursor++; }

当该字符为’\’时,cursor会++自增1,然后获取第二个字符’\’,把该字符append到result中,关键之处就在这里了,它把连续的两个反斜杠(‘\\’)变成了一个反斜杠(‘\’),到这里,问题貌似搞明白了。

那么,我们最终展示\n的写法应该是

System.out.println(array.replaceAll("\n","\\\\n"));

展示\\n的写法应该是

System.out.println(array.replaceAll("\n","\\\\\\\\n"));


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭