REGEXREPLACE( ) 函数

将与正则表达式匹配的字符串的所有实例替换为新的字符串。

语法

REGEXREPLACE(字符串, 模式, 新字符串)

参数

名称 类型 描述
字符串

字符

要测试其是否存在匹配模式的域、表达式或字面量值。
模式

字符

要搜索的模式字符串(正则表达式)。

模式可以包含字面量字符、元字符或两者的组合。字面量字符包括所有字母数字字符、某些标点符号字符和空白。

搜索区分大小写,这意味着必须明确指定大写和小写字母字符。

新字符串 字符

用来替换所有与模式匹配的值的字符串。

替换字符串可以包含字面量字符、原始字符串中的字符组(使用 $int 元素)或两者的组合。

输出

字符。

示例

基本示例

使用空格

通过将文本字符之间的多个空格替换为单个空格返回 "AB CD EF":

REGEXREPLACE("AB CD   EF", "\s+", " ")

返回字符域数据,并且将单词之间的空格标准化为单个空格:

REGEXREPLACE(字符域, "\s+", " ")

返回字符域数据,并且将单词之间的空格标准化为单个空格。在新字符串中使用 BLANKS( ) 函数而不是字面量空格,可使空格更加易于阅读,并且不太容易被忽略。

REGEXREPLACE(字符域, "\s+", BLANKS(1))

标准化电话号码

返回 "(123) 456-7890"。电话号码 '1234567890' 的格式被标准化。

REGEXREPLACE(SUBSTR("1234567890",1,14), "(\d{3})[\s-]*(\d{3})[\s-]*(\d{4})","($1) $2-$3")

返回电话号码域中的数字并且对其格式进行标准化:

REGEXREPLACE(电话号码, ".*(\d{3})[\s-\.\)]*(\d{3})[\s-\.]*(\d{4})", "($1) $2-$3")

从附近的文本中提取 "123-456-7890":

REGEXREPLACE("Tel 数字: 123-456-7890 (office)", "(.*)(\d{3}[\s-\)\.]*\d{3}[\s-\.]*\d{4})(.*)", "$2")

注释域中的附近文本中提取电话号码并标准化其格式。

REGEXREPLACE(注释, "(.*)(\d{3})[\s-\)\.]*(\d{3})[\s-\.]*(\d{4})(.*)","($2) $3-$4")

标识一般格式

返回 "9XXX-999xx",它表示由字符串指定的值的一般格式 ("1ABC-123aa"):

REGEXREPLACE(REGEXREPLACE(REGEXREPLACE("1ABC-123aa","\d","9"),"[a-z]","x"),"[A-Z]", "X")

返回发票编号域中所有标识符的一般格式:

REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(发票编号,"\d","9"),"[a-z]","x"),"[A-Z]", "X")

标准化名称格式

返回 "John David Smith":

REGEXREPLACE("Smith, John David", "^(\w+),(\s\w+)(\s\w+)?(\s\w+)?","$2$3$4 $1")

按常规顺序返回全名域中的名称:名字中间名)(中间名姓氏

REGEXREPLACE(全名, "^(\w+),(\s\w+)(\s\w+)?(\s\w+)?","$2$3$4 $1")

说明

姓名数据可能带来各种困难,如姓名中的撇号。考虑姓名数据中的各种变化通常要求使用比上面示例中提供的更加复杂的正则表达式。

备注

工作原理

REGEXREPLACE( ) 函数使用正则表达式在数据中查找匹配模式,并且将任何匹配值替换为新的字符串。

例如:

REGEXREPLACE(字符域, "\s+", " ")

通过将文本字符之间的一个或多个空格替换为单个空格来标准化字符数据中的空格。

REGEXREPLACE( ) 的搜索部分与 REGEXFIND( ) 函数完全相同。有关这两个函数所共有的搜索功能的详细信息,请参见 REGEXFIND( ) 函数

何时使用 REGEXREPLACE( )

每当您想要使用简单或复杂模式匹配在 Analytics 中查找和替换数据时,请使用 REGEXREPLACE( )。

用其自身替换字符

您可以使用 $int 元素将字符替换为它们自己,以便保留有意义的数据部分,同时将环绕或混杂数据标准化或忽略。

上面显示了多个使用电话号码和名称的示例。

要使用 $int 元素,您必须首先通过在模式值中使用括号 ( ) 来创建组。要了解更多信息,请参考REGEXFIND( ) 函数

避免连续字符匹配

通过嵌套 REGEXREPLACE( ) 函数,您可以避免连续字符匹配,并且替换子串,而无论它们之间的相互位置怎样。

下面两个示例中的问题是从字母数字源数据(其中的数字和字母可以按任何顺序出现)中导出一般格式。如果不知道数字和字母的顺序,如何构建模式字符串?

解决方案是首先使用内部 REGEXREPLACE() 函数查找和替换数字,然后使用外部 REGEXREPLACE() 函数查找和替换字母。

返回 "999XXX":

REGEXREPLACE(REGEXREPLACE("123ABC","\d","9"),"[A-Z]","X")

返回 "9X9X9X":

REGEXREPLACE(REGEXREPLACE("1A2B3C","\d","9"),"[A-Z]","X")

替换字符串长度和截断

当您使用 REGEXREPLACE( ) 创建计算域时,该计算域的长度将与原始域长度相同。

如果替换字符串的长度超过目标字符串的长度,则字符串总长度会增加,当计算域长度无法适应增加的字符串长度时,这会导致截断。

将首先截断目标字符串后面的字符,然后截断后面的替换字符串字符。下面的示例演示了截断:

字符串

模式

新字符串

域长度

结果

截断的字符

x123x

123

A

5

"xAx"

x123x

123

ABC

5

"xABCx"

x123x

123

ABCD

5

"xABCD"

"x"

x123x

123

ABCDE

5

"xABCD"

"x", "E"

x123x

123

ABCDE

6

"xABCDE"

"x"

x123x

123

ABCDE

7

"xABCDEx"

如何避免截断

要避免截断,请使用 SUBSTR( ) 函数增加域长度,如下面的第二个示例所述的那样。

返回 "xABCD",截断了替换字符 "E" 和现有字符 "x":

REGEXREPLACE("x123x","123","ABCDE")

返回 "xABCDEx",其中包括所有替换字符和未替换的现有字符:

REGEXREPLACE(SUBSTR("x123x",1,10),"123","ABCDE")

正则表达式元字符

下表列出了您可以用于 REGEXFIND( ) 和 REGEXREPLACE( ) 的元字符,并且描述了每个元字符所执行的操作。

存在其他正则表达式语法,并且受到 Analytics 的支持,但是它更加复杂。对其他语法的完整解释超出了本指南的范围。互联网上有大量解释正则表达式的资源。

Analytics 使用正则表达式的 ECMAScript 实现。大多数的正则表达式实现使用公共内核语法。

说明

Analytics 中的当前正则表达式实现不完全支持搜索除英语以外的语言。

元字符

描述

.

匹配任何字符(换行符除外)

?

匹配前趋字面量、元字符或元素的 0 或 1 个实例

*

匹配前趋字面量、元字符或元素的 0 或 更多个实例

+

匹配前趋字面量、元字符或元素的 1 或 更多个实例

{}

匹配前趋字面量、元字符或元素的指定个数的实例您可以指定一个精确的数字、一个范围或一个开放式范围。

例如:

  • a{3} 匹配 "aaa"

  • X{0,2}L 匹配 "L"、"XL" 和 "XXL"

  • AB-\d{2,}-YZ 匹配任何具有前缀 "AB-"、后缀 "-YZ" 并且包含两个或更多个数字的字母数字标识符

[]

匹配任何位于括号内的单个字符

例如:

  • [aeiou] 匹配 a、e、i、o 和 u

  • [^aeiou] 匹配除 a、e、i、o 和 u 以外的任何字符

  • [A-G] 匹配从 A 到 G 的任何大写字母

  • [A-Ga-g] 匹配从 A 到 G 的任何大写字母,或从 a 到 g 的任何小写字母

  • [5-9] 匹配从 5 到 9 的任何数字

()

创建一个组以定义一个字符序列或字符块,它们以后可被视为单个单元。

例如:

  • S(ch)?mid?th? 匹配 "Smith" 或 "Schmidt"

  • (56A.*){2} 匹配任何在其中至少两次出现 "56A" 的字母数字标识符

  • (56A).*-.*\1 匹配任何在其中至少两次出现 "56A" 且在两者之间包含一个连字符的字母数字标识符

\

转义字符,它指定紧跟在后面的字符是字面量。如果您想要按照字面匹配元字符,请使用转义符。例如,\( 查找左括号,\\ 查找反斜杠。

如果您想要按照字面意义匹配下列任一字符,请使用转义符:

^ $ . * + ? = ! : | \ ( ) [ ] { }

其他标点符号字符,如 & 或 @ 不需要转义符。

\int

指定之前用括号 ( ) 定义的一个组重现。int 是一个整数,它标识以前定义的组相对于任何其他组的顺序位置。在 REGEXFIND( ) 和 REGEXREPLACE( ) 的模式参数中,都可以使用此元字符。

例如:

  • (123).*\1 匹配任何在其中至少两次出现 "123" 数字组的标识符

  • ^(\d{3}).*\1 匹配任何在其中重复出现前 3 个数字的标识符

  • ^(\d{3}).*\1.*\1 匹配任何在其中至少两次重复出现前 3 个数字的标识符

  • ^(\D)(\d)-.*\2\1 匹配任何在其中重复出现字母数字前缀且字母字符和数字字符颠倒位置的标识符

$int

指定在替换字符串中使用在目标字符串中找到的一个组。int 是一个整数,它标识目标字符串中的组相对于任何其他组的顺序位置。此元字符只能用在 REGEXREPLACE( ) 中的新字符串参数中

例如:

  • 如果模式 (\d{3})[ -]?(\d{3})[ -]?(\d{4}) 用于匹配各种不同的电话号码格式,则新字符串 ($1)-$2-$3 可用于将数字替换为它们自身,并且标准化格式。999 123-4567 和 9991234567 都变成 (999)-123-4567。

|

匹配管道 (|) 前后的字符、字符块或表达式

例如:

  • a|b 匹配 a 或 b

  • abc|def 匹配 "abc" 或 "def"

  • Sm(i|y)th 匹配 Smith 或 Smyth

  • [a-c]|[Q-S]|[x-z] 匹配下列任一字母:a、b、c、Q、R、S、x、y、z

  • \s|- 匹配一个空格或连字符

\w

匹配任何单词字符(a 到 z、A 到 Z、0 到 9 和下划线字符 _)

\W

匹配任何非单词字符(除 a 到 z、A 到 Z、0 到 9 和下划线字符 _ 以外的字符)

\d

匹配任何数字(任何十进制数字)

\D

匹配任何非数字(任何不是十进制数字的字符)

\s

匹配空格(空白)

\S

匹配任何非空格(非空白字符)

\b

匹配单词边界(在 \w 和 \W 字符之间)

单词边界本身不包含空格。例如:

  • "United Equipment" 包含 4 个单词边界 – 空格的两侧各有一个,字符串的开头有一个,结尾有一个。"United Equipment" 被正则表达式 \b\w*\b\W\b\w*\b 匹配

提示

除了空格以外,逗号、句号和其他非单词字符也可以充当单词边界。

例如,以下表达式的求值结果为“真”:

REGEXFIND("jsmith@example.net", "\bexample\b")

^

匹配字符串的开头

在括号 [ ] 内,^ 否定内容

$

匹配字符串的结尾

相关函数

如果您想要查找匹配模式但不替换它们,请使用 REGEXFIND( ) 函数

ACL 脚本指南 14.1