regex - Spark DataFrame `regexp_replace` 中的反向引用

标签 regex scala apache-spark spark-dataframe backreference

我最近试图回答 question ,当我意识到我不知道如何在带有 Spark DataFrames 的正则表达式中使用反向引用时。

例如,使用 sed,我可以做到

> echo 'a1
b22
333' | sed "s/\([0-9][0-9]*\)/;\1/"                                                                                                   

a;1
b;22
;333

但使用 Spark DataFrames 我不能:

val df = List("a1","b22","333").toDF("str")
df.show

+---+
|str|
+---+
| a1|
|b22|
|333|
+---+

val res = df  .withColumn("repBackRef",regexp_replace('str,"(\\d+)$",";\\1"))
res.show

+---+-----------+
|str|repBackRef|
+---+----------+
| a1|       a;1|
|b22|       b;1|
|333|        ;1|
+---+----------+

为了明确一点:我不想要这种特殊情况下的结果,我想要一个与反向引用一样通用的解决方案,例如 sed .

另请注意,使用 regexp_extract缺乏,因为它在没有匹配时表现不佳:

val res2 = df
  .withColumn("repExtract",regexp_extract('str,"^([A-z])+?(\\d+)$",2))
res2.show

所以你不得不像我在上述 answer 中所做的那样,对每个模式使用一列进行提取。 .

谢谢!

最佳答案

您需要使用 $+numeric_ID 反向引用语法:

.withColumn("repBackRef",regexp_replace('str,"(\\d+)$",";$1"))
                                                         ^^

关于regex - Spark DataFrame `regexp_replace` 中的反向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40150606/

相关文章:

apache-spark - Spark中执行程序和任务的内存分配

scala - Spark数据集联合重置类变量

python - 正则表达式中的 `\A` 与 `^`(插入符号)之间是否存在差异?

Java 如果字符串包含空格或 "-"以及之前或之后的字符,如何拆分()

.net - 替换正则表达式中的多个捕获组

scala - 为什么使用 foldLeft 而不是程序版本?

scala - 使用 BasicAuth 进行喷射身份验证方法

java - 在一个项目中混合 java、scala 和 xtend 文件?

apache-spark - 如何获取 DataFrame 的字符串表示形式(如 Dataset.show)?

xsd 断言中的正则表达式仅限于元素值的开头