将一些转义字符替换为指定标准的字符

需求:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R_记忆犹新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值