在 Spark Java 的 details 列中使用 Regex_replace 将 '|' 替换为 '-' 的正确方法是什么?

What is the correct way to use Regex_replace to replace a '|' with a '-' in Spark Java's column named details?

提问人:Sachin 提问时间:5/27/2023 最后编辑:Brian Tompsett - 汤莱恩Sachin 更新时间:5/29/2023 访问量:40

问:

我有一个名为 details 的列,它具有特殊字符,因为我想用 替换它。如何在 spark Java 中做到这一点?|-

我试过:

  1. regex_replace(details ,"|","-")
  2. regex_replace(details ,"\\|","-")

只是想知道哪个是正确的一两个,特殊字符之前有什么用。如果我不包括,我的会在字符串中被替换吗?\\\\|details

java 字符串 apache-spark regexp-replace spark-java

评论


答:

0赞 vilalabinot 5/29/2023 #1

如果不包含 ,这是正则表达式的转义序列,则字符串的每个字符之间都会有一个 in。这意味着,如果您有:\\-

my | text,并且你使用 ,你最终会得到: because 在正则表达式中具有特殊含义 ( -> alternamte - match either or )。regexp_replace(details, "|", "-")-m-y- -|- -t-e-x-t-|a|bab

因此,您必须使用第二个选项,该选项将返回 .my - text

0赞 Reilas 5/29/2023 #2

有几件事需要考虑。

在许多编码语言中,字符串文本可能包含所谓的转义序列
从本质上讲,它是一种用于表示非打印字符(如换行符)的语法。

请考虑以下字符串值。

string = "stack\noverflow"

这里的反向固相符是一个能指,称为转义字符,用于将紧跟在它后面的字符呈现为限定符,而不是在本例中为文字 n
在这种情况下,\n 映射到换行符,通常称为“换行符”。

如果通过将字符串打印到标准输出来评估字符串,则会导致以下结果。

stack
overflow

regex_replace,在聚合方法中,第一个参数是正则表达式模式
正则表达式只是一组语法值,用于表示文本值。
例如,表达式 [a-z] 将与任何小写字母 az 匹配。
因此,在正则表达式中,您可以键入“[a-z]at”,它将匹配“bat”、“cat”、“mat”、“vat”等。

在正则表达式模式中,| 字符是一个语法字符,类似于大多数编码语言中使用的 ||、or 运算符。

如果要在正则表达式模式中表示文本 | 字符,则必须使用 \、reverse-solidus、escape-character 取消转义该字符。

因此,从本质上讲,您的第一个参数是计算转义的正则表达式元字符,然后需要在字符串文本中对其进行转义。

所以你得到了 2 个反向固体。

关于如果您不包括双反向实心会发生什么。

正则表达式模式匹配发生在值字符串的从左到右遍历中。

将发生的情况是,它将匹配您的第一个字符,或者什么都不匹配(冗余),并放置替换值,在本例中为 -

它将继续到下一个字符,并且由于它再次匹配,因此将放置另一个替换值。
这将一直持续到到达字符串的末尾。

因此,如果字符串值为“stack\noverflow”,则将获得以下替换字符串

-s-t-a-c-k-\n-o-v-e-r-f-l-o-w-