需求:
各字段中的 回车符、换行符 使用空格符(“ ”,十六进制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()不同的是,只替换第一次出现的字符串。