
一堆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)
“*** *** ***og ca*** *** ***”
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)
“猫狗 t d 猫狗”
GLOBALREPLACE 使正则表达式查找并替换所有匹配项;该模式匹配 catog 或 cadog。 后向引用是 t 或 d,因为这是括号内的模式部分。 模板在 \1 值周围添加一些空格,然后用模板替换每个匹配的 catog 或 cadog。
可以使用多个括号对,既可以嵌套也可以按顺序使用。 只需计算打开的括号即可找到后面的参考号。
数据表公式
这是使用正则表达式的姓氏,名字示例。
Column formula using regex()使用 regex() 的列公式
此示例使用锚 ^ 和 $(绿色下划线)。 ^ 匹配字符串的开头, $ 匹配字符串的结尾。 \w* 匹配零个或多个单词字符。这个例子可能太简单了;它不会处理带有特殊字符或空格的名称。 您可以使用反向引用对其进行修改以使用逗号分隔:正则表达式(名称,“([^,]*)”,“\1”)和正则表达式(名称, "\s*([^,]*)$", "\1")也许。“([^,]*)”表示零个或多个非逗号字符和"\s*([^,]*)$"表示跳过零个或多个空格,保留所有非逗号,并在最后。 在里面“([^,]*)”情况 \1 和 \0 是相同的。 但在"\s*([^,]*)$", \0 可能有 \1 没有的前导空格,因为 \s* 在 \1 的括号之外。
正则表达式还有很多,在网络上的其他地方都有很好的描述(搜索正则表达式)。 如果您对如何使用反向引用感到困惑,脚本索引中的 Alice 和 Jerry 示例也非常好。
下一个:模式匹配函数。
2017 年 1 月 29 日更新:修复了新社区的格式。