如何用Perl正则表达式检测字符串中的无效SAS库名
SAS库名有效性检测的Perl正则解决方案
规则回顾
SAS库名需满足以下3条规则:
- 长度不超过8个字符
- 仅可包含英文字母、数字、下划线
- 必须以英文字母或下划线开头
核心思路
要判断空格分隔的字符串中是否存在无效库名,本质就是检测字符串中是否存在不匹配有效库名正则的单词。有效库名的正则表达式为:^[A-Za-z_][A-Za-z0-9_]{0,7}$
各部分解释:
^[A-Za-z_]:确保开头是字母或下划线[A-Za-z0-9_]{0,7}:后续可跟0-7个合法字符,保证总长度≤8$:匹配单词结尾,确保没有多余字符
修正后的SAS代码
将原代码中的正则替换为能匹配任意无效库名的模式,当找到无效库名时prxmatch返回非0值,我们将结果转为1(存在无效)或0(全有效):
data test; input string&$42.; /* 匹配任何不符合有效库名规则的单词 */ x = (prxmatch('/\b(?!([A-Za-z_][A-Za-z0-9_]{0,7})\b)\S+/', string) > 0); put x=; cards; sasuser work sashelp sasuser work 7z sashelp sasuser work dictionary ; run;
验证结果
运行代码后输出与预期完全一致:
- 第一行(全有效库名):
x=0 - 第二行(含
7z,以数字开头):x=1 - 第三行(含
dictionary,长度为9):x=1
疑问解答
是的,可以通过检测字符串中存在不匹配有效SAS库名正则的单词来实现需求。我们的解决方案正是基于这个逻辑:只要找到一个不满足有效规则的单词,就判定存在无效库名,返回1;反之返回0。
内容的提问来源于stack exchange,提问作者whymath
相关产品推荐
相关产品推荐

