
一堆JMP字符函数出现在一个上一篇文章:长度、子字符串、包含等。 它们非常适合简单的事情,而你可以如果你愿意的话,可以和他们一起做一些困难的事情。 但正则表达式可能会更好。
正则表达式,缩写正则表达式,是用于操作文本的强大 JSL 函数。
result = regex( sourceText, searchPattern, replaceTemplate, options );
(JSL 中还有另外两个函数,其名称中带有 Regex;现在只需查看普通的“regex”。 这是您想要的,特别是当您在列公式中使用它时。)
这是对正则表达式的非常不完整的介绍(但对 JMP 正则表达式函数的相当完整的描述)。 你可以在网上找到很多关于正则表达式的教程; JMP的正则表达式搜索模式类似于 Perl 的正则表达式。
这搜索模式是正则表达式并描述要查找的文本。 这替换模板描述如何替换匹配的文本并可以使用匹配文本的位在模板中。 为了清楚起见,以下示例使用文字字符串(用引号引起来)作为第一个参数,但使用一个变量来保存源文本几乎总是更有意义。
regex( "123 456 789", "[0-9]*")
“123”
这个例子有两个参数,源文本和搜索模式。 searchPattern 使用方括号创建一组字符。 连字符快捷方式指定一个范围。 您可以使用 [a-zA-Z] 来创建一组所有大写和小写 ASCII 字符。 星号 (*) 表示“重复先前的模式零次或多次”。 \d 是所有数字集合的快捷方式。
regex( "123 456 789", "\d*")
“123”
像 [0123456789] 这样的字符集可以通过以帽子开头来否定: [^0123456789] 匹配任何不是数字的字符。 一些快捷方式如 \d 可以表示为字符集:
| \w |
[a-zA-Z0-9_] |
单词字符 |
| \W |
[^a-zA-Z0-9_] |
不是单词字符 |
| \d |
[0-9] |
数字 |
| \D |
[^0-9] |
不是数字 |
| \s |
[\t\v\f] |
空白包括制表符、回车符、换行符、垂直制表符和换页符 |
| \S |
[^\t\v\f] |
不是空格 |
上面的所有快捷键都匹配单个字符。 您可以添加星号
\s*
匹配一系列零个或多个空白字符。 或者,您可以添加一个加
\D+
匹配一系列一个或多个非数字字符。 或者,您可以添加一个问号
\w?
匹配零或一单词字符。
星号、加号和问号是重复运算符,它们是贪婪的。 贪婪意味着他们会获取尽可能多的文本,然后在需要时退出。 通过添加问号可以让他们不情愿。 一般来说,贪婪是您想要的行为,但并非总是如此。
括号、反向引用和替换模板
正则表达式的很多功能来自于之间的交互搜索模式和替换模板。 交互是通过使用反向引用创建的,表示为 \0、\1、\2、... ReplaceTemplate 默认值为“\0”。 反向引用 \0 是匹配的整个文本。 正则表达式中使用括号将模式的位组合在一起以形成更大的模式。 例如
regex( "cat dog catog cadog cat dog", "cat|dog", "***", GLOBALREPLACE)
“*** *** ***我*** *** ***”
regex( "cat dog catog cadog cat dog", "ca(t|d)og", "***", GLOBALREPLACE)
“猫狗******猫狗”
竖线分隔备选方案,并且优先级非常低;第二个示例使用括号将 t 或 d 组合在一起。 这替换模板只是常量文本,***。 但是每个左括号都开始一个新的反向引用,并且反向引用可以在模板中使用:
regex( "cat dog catog cadog cat dog", "ca(t|d)og", " \1 ", GLOBALREPLACE)
“猫狗td猫狗”
GLOBALREPLACE 使正则表达式查找并替换所有匹配项;该模式与 catog 或 cadog 匹配。 后向引用是 t 或 d,因为这是括号内模式的部分。 模板在 \1 值周围添加一些空格,然后用模板替换每个匹配的 catog 或 cadog。
可以使用多个括号对,可以是嵌套的,也可以是按顺序的。 只需计算左括号即可找到后面的参考号。
数据表公式
这是使用正则表达式的姓氏、名字示例。
Column formula using regex()Column formula using regex()Column formula using regex()Column formula using regex()使用 regex() 的列公式
此示例使用锚点 ^ 和 $(以绿色下划线)。 ^ 匹配字符串的开头,$ 匹配字符串的结尾。 \w* 匹配零个或多个单词字符。这个例子可能太简单了;它不会处理带有特殊字符或空格的名称。 您可以使用反向引用对其进行修改,以逗号分隔:正则表达式(名称, "([^,]*)", "\1")和正则表达式(名称, "\s*([^,]*)$", "\1")也许。“([^,]*)”表示零个或多个不是逗号的字符,并且“\s*([^,]*)$”表示跳过零个或多个空格,保留所有非逗号,并位于末尾。 在里面“([^,]*)” \1 和 \0 的情况相同。 但在"\s*([^,]*)$", \0 可能有 \1 没有的前导空格,因为 \s* 在 \1 的括号之外。
正则表达式还有很多内容,在网络其他地方有详细描述(搜索 regex)。 如果您对如何使用反向引用感到困惑,脚本索引中的 Alice 和 Jerry 示例也非常好。
下一步:模式匹配函数。
2017 年 1 月 29 日更新:修复了新社区的格式。