Scala String.replaceALL() 替换 '\' 字符

本文介绍在Spark处理文本数据时遇到含有特殊字符''的问题及解决办法。通过正确的字符串替换避免了Json解析异常,并提供了两种有效的转义字符处理方式。

Spark处理一批文本数据的时候,有的文本中存在'\'字符,在拼接Json字符串的时候会错误的将Json的 " 转义掉,这样会导致Json的解析异常,所以需要将'\'去掉,然后首先想到了下面的写法:

val str = """\哈哈哈\"""

// 注意,这是错误的写法!
str.replaceAll("""\""","")

结果出现了下面的异常:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^
    at java.util.regex.Pattern.error(Pattern.java:1924)
    at java.util.regex.Pattern.compile(Pattern.java:1671)
    at java.util.regex.Pattern.<init>(Pattern.java:1337)
    at java.util.regex.Pattern.compile(Pattern.java:1022)
    at java.lang.String.replaceAll(String.java:2162)
    at com.neusoft.apps.Test$.main(Test.scala:37)
    at com.neusoft.apps.Test.main(Test.scala)

原因是:'\' 其实在正则表达式中依然是转移字符,虽然 """\""" 这种写法,在Scala中不需要转义就代表 '\' 字符,但是java.util.regex.Pattern中仍然将其视为转义符,而转义符后面没有跟待转义的字符,然后就报错了。
所以,转义符'\' 后再加上 '\' ,再进行一次转义才相当于字符 '\'

val str = """\哈哈哈\"""
str.replaceAll("""\\""","")

或者

val str = """\哈哈哈\"""
str.replaceAll("\\\\","")

同理,在String.split()方法中也是如此。

Scala 中,统计给定字符串中各个单词的出现次数是一个常见的文本处理任务。下面我们将完成这个功能,并嵌入到您的代码框架中。 ### 实现步骤: 1. **读取输入字符串**:我们可以利用 `scala.io.StdIn` 来获取用户输入的一行字符串。 2. **分割字符串为单词列表**:使用空格或其他分隔符(如标点符号)将字符串拆分为一个个单词。 3. **统计每个单词的频率**:借助 Scala 的集合操作,比如 `groupBy`、`mapValues` 或者直接用 `foldLeft` 等函数来计算词频。 4. **输出结果**:打印出每个单词及其对应的出现次数。 下面是完整的实现代码: ```scala import scala.io.StdIn object ForDemo { def main(args: Array[String]): Unit = { /********** Begin **********/ // 统计给定字符串中各单词出现的次数 // 提示用户输入一行字符串 println("请输入一段文字:") val inputString = StdIn.readLine() // 去掉标点并将字符串按空格切分成单词数组 val wordsArray = inputString.toLowerCase.replaceAll("[^a-zA-Z0-9\\s]", "").split("\\s+") // 使用 groupBy 和 mapValues 来统计每个单词出现的次数 val wordCounts = wordsArray.groupBy(identity).mapValues(_.length) // 打印结果 if (wordsArray.isEmpty) { println("未检测到任何有效单词!") } else { println("单词出现的次数如下:") wordCounts.foreach { case (word, count) => println(s"$word -> $count") } } /********** End **********/ } } ``` #### 详细解析: 1. **去掉标点并标准化大小写** ```scala .toLowerCase.replaceAll("[^a-zA-Z0-9\\s]", "") ``` 此步确保我们只关心字母和数字字符,忽略大小写的区别并且清除所有非标准的分隔符(像逗号、句号等)。 2. **按照空白切割字符串** ```scala split("\\s+") ``` 利用正则表达式 `\s+`, 它表示一个或多个空白字符作为分割依据,这包括空格、制表符以及其他形式的间隔。 3. **对单词进行分组并计数** - `groupBy(identity)` 返回 Map[Word, List[Word]] 形式的结构; - `.mapValues(_.length)` 将上述 map 结构转化为 Word->Count 对应的关系。 4. **显示结果** --- 如果运行该程序,你可以尝试输入类似以下内容: ``` Hello world! Hello everyone. ``` 然后它会给出这样的输出: ``` hello -> 2 world -> 1 everyone -> 1 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值