当前位置:网站首页>将一些转义字符替换为指定标准的字符
将一些转义字符替换为指定标准的字符
2022-07-22 10:25:00 【R_记忆犹新】
需求:
各字段中的 回车符、换行符 使用空格符(“ ”,十六进制0x20)进行转义。 英文逗号“,” 双引号“"” 单引号“’”以及竖线分隔符“|” 按照RFC1738标准分别使用 %2C、%22、%27、%7C进行转义。
package com.rk.spark
import org.apache.commons.lang.StringEscapeUtils
/**
* @program: bd1809
* @class_name StringTest
* @author: rk
* @create: 2019-03-15 12:06
* @Description:
* 各字段中的 回车符、换行符 使用空格符(“ ”,十六进制0x20)进行转义。 英文逗号“,” 双引号“"”
* 单引号“’”以及竖线分隔符“|” 按照RFC1738标准分别使用 %2C、%22、%27、%7C进行转义。
*
*
* replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换
* (CharSequence即字符串序列的意思,说白了也就是字符串);
*
* replaceAll的参数是regex,即基于规则表达式的替换,比如:可以通过replaceAll("\\d", "*")
* 把一个字符串所有的数字字符都换成星号;
*
* 相同点:都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串;
*
* 不同点:replaceAll支持正则表达式,因此会对参数进行解析(两个参数均是),如replaceAll("\\d", "*"),
* 而replace则不会,replace("\\d","*")就是替换"\\d"的字符串,而不会解析为正则。
*
* 另外还有一个不同点:“\”在java中是一个转义字符,所以需要用两个代表一个。
* 例如System.out.println( "\\" ) ;只打印出一个"\"。但是“\”也是正则表达式中的转义字符,需要用两个代表一个。
* 所以:\\\\被java转换成\\,\\又被正则表达式转换成\,因此用replaceAll替换“\”为"\\",
* 就要用replaceAll("\\\\","\\\\\\\\"),而replace则replace("\\","\\\\")。
*
**/
object StringTest {
def main(args: Array[String]): Unit = {
val str = "aa\raabbb\rccc\nsc"
println(str)
//使用StringEscapeUtils.escapeJava()可以显示不转义的字符串
val out: String = StringEscapeUtils.escapeJava(str)
println(out)
println(out.replace("\\r", " "))
//replaceAll底层是使用的正则表达式
println(out.replaceAll("\\\\r"," "))
println(getSpecialCharTransferField(str))
}
def getSpecialCharTransferField(field:String):String= {
var aa = field
var lastStr = ""
var lastStr01 = ""
var lastStr02 = ""
var lastStr03 = ""
var lastStr04 = ""
if(field.contains("\r")||field.contains("\n")){
val reg = "\r|\n".r
lastStr = field.replaceAll(reg.toString()," ")
aa = lastStr
}
if(aa.contains(",")||aa.contains("\"")||aa.contains("'")||aa.contains("|")){
lastStr01 = aa.replace(",","%2C")
lastStr02 = lastStr01.replace("\"","%22")
lastStr03 = lastStr02.replace("'","%27")
lastStr04 = lastStr03.replace("|","%7C")
aa = lastStr04
}
aa
}
}
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
上面为String类中replaceAll的源码,可以看出底层是采用的正则表达式的方式。
顺便整理一下replace和replaceAll的区别:
replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);
replaceAll的参数是regex,即基于规则表达式的替换,比如:可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号;
相同点:都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串;
不同点:replaceAll支持正则表达式,因此会对参数进行解析(两个参数均是),如replaceAll("\\d", "*"),而replace则不会,replace("\\d","*")就是替换"\\d"的字符串,而不会解析为正则。
另外还有一个不同点:“\”在java中是一个转义字符,所以需要用两个代表一个。例如System.out.println( "\\" ) ;只打印出一个"\"。但是“\”也是正则表达式中的转义字符,需要用两个代表一个。所以:\\\\被java转换成\\,\\又被正则表达式转换成\,因此用replaceAll替换“\”为"\\",就要用replaceAll("\\\\","\\\\\\\\"),而replace则replace("\\","\\\\")。
如果只想替换第一次出现的,可以使用replaceFirst(),这个方法也是基于规则表达式的替换,但与replaceAll()不同的是,只替换第一次出现的字符串。
边栏推荐
- Fluent 2 Advanced (VIII): eventbus, carousel map and immersive status bar
- If else optimization
- Fluent 2 Advanced (III): imitate BiliBili, login and register
- Flutter 2进阶(四):基于Navigator 2.0封装
- Win10图标变白纸了,恢复方法
- One master-slave replication of MySQL
- 人和产品的五个层次
- Creation of sparksql dataset
- 求幂的位数,求阶乘的位数
- AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法
猜你喜欢
Spark loads CSV and JSON files (attached to the virtual machine to execute the jar package)
图的深度优先搜索和广度优先搜索
Flutter 2进阶(一):Flutter实用技巧
ping: www.baidu.com: 未知的名称或服务原因分析
蓝桥杯省赛训练营——栈与递归
Docker - DB2 database deployment through container installation tutorial
蓝桥杯省赛训练营——常用STL
Record the failure experience of installing cupy in win10 (with comparison between cupy and numpy)
Opening soon | openatom openharmony sub forum of 2022 open atom global open source summit "interconnection of all things, enabling thousands of industries"
appstore 上传屏幕快照尺寸
随机推荐
蓝桥杯省赛训练营——栈与递归
Fluent 2 Advanced (V):json_ Serializable use
Flutter 2进阶(一):Flutter实用技巧
leetcode 32. 最长有效括号
【TA-霜狼_may-《百人计划》】图形3.3 曲面细分与几何着色器 大规模草渲染
Use of JVM jstat (virtual machine statistics monitoring tool)
【C】二叉树遍历的递归与非递归写法
leetcode 22. 括号生成
Record the failure experience of installing cupy in win10 (with comparison between cupy and numpy)
try catch
求N!后面有多少个0
if else优化
euler五十讲(一)
Docker - DB2 database deployment through container installation tutorial
深入浅出ES6(四):模板字符串
【总结思考】高可用架构设计的7大核心原则
左侧宽度固定、右侧宽度自适应
最佳实践|用腾讯云AI文字识别实现企业资质证书识别
Five levels of people and products
2017年终总结