You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式解析RDD中的字符串数组以提取指定字段?

解决Spark RDD字符串拆分的正则问题

我来帮你搞定这个正则解析的问题~你之前的正则表达式没生效主要是几个细节没处理对,咱们一步步来:

原正则的问题分析

你用的"[.]+\(([.]+)\)[.]+"有两个关键错误:

  • [.]是匹配单个点字符,不是你想的“任意字符”,匹配任意字符应该用.;
  • 没有考虑字符串里的空格分隔,而且贪婪模式会导致匹配范围超出预期,没法精准拆分出三个部分。

正确的正则表达式

针对你的固定格式字符串,推荐使用这个正则:

^(.*?) \((.*?)\) (.*)$

每个分组的作用:

  • (.*?):第一个非贪婪分组,匹配姓名(比如Tony Stark),直到遇到 ((空格+左括号)就停止;
  • \((.*?)\):第二个分组,匹配括号里的国家(比如USA),左/右括号需要转义成\(和\);
  • (.*)$:第三个分组,匹配从空格后到结尾的所有内容,也就是日期部分。

Spark RDD的代码实现示例

用Scala代码来演示如何在RDD中应用这个正则拆分出三个目标数组:

import scala.util.matching.Regex

// 初始化输入RDD
val inputRDD = sc.parallelize(Array(
  "Tony Stark (USA) 16th October 2015", 
  "Peter Comb (Canada) 21st September 2015"
))

// 定义正则模式
val splitPattern: Regex = "^(.*?) \\((.*?)\\) (.*)$".r

// 拆分出三个RDD
val namesRDD = inputRDD.map {
  case splitPattern(name, _, _) => name
}
val countriesRDD = inputRDD.map {
  case splitPattern(_, country, _) => country
}
val datesRDD = inputRDD.map {
  case splitPattern(_, _, date) => date
}

// 验证结果
println(namesRDD.collect().mkString(", "))      // 输出: Tony Stark, Peter Comb
println(countriesRDD.collect().mkString(", "))  // 输出: USA, Canada
println(datesRDD.collect().mkString(", "))      // 输出: 16th October 2015, 21st September 2015

这个方案能精准匹配你给出的字符串格式,只要输入的每个元素都遵循“姓名 (国家) 日期”的结构,就能稳定拆分出三个目标数组。

内容的提问来源于stack exchange,提问作者jOasis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:08:20