楼主: whymath
985 7

[技术讨论与投票] 如何使用正则表达式识别字符串中的非法逻辑库名 [推广有奖]

  • 1关注
  • 16粉丝

实习版主

已卖:43份资源

副教授

21%

还不是VIP/贵宾

-

威望
0
论坛币
5811 个
通用积分
708.1507
学术水平
126 点
热心指数
145 点
信用等级
88 点
经验
22480 点
帖子
581
精华
2
在线时间
608 小时
注册时间
2018-5-31
最后登录
2025-10-29

楼主
whymath 发表于 2022-11-11 10:03:58 |AI写论文
100论坛币
我想要构造一个正则表达式,判断一串文本中,是否包含不可以用作SAS逻辑库名的单词。SAS逻辑库命名规则如下:
1. 不多于8个字符;
2. 可由下划线、英文字母、阿拉伯数字构成;
3. 首字母是下划线或英文字母;

我的思路如下:
1. 在字符串中匹配一个单词;
2. 这个单词不满足某个模式;
3. 这个模式是SAS逻辑库名的命名规则;

我做了一些尝试,但仍未获得成功。我想,是不是要用到负向零宽断言?

测试数据如下:
  1. data test;
  2.   string='sasuser work 7z sashelp'; output;
  3.   string='sasuser work sashelp'; output;
  4.   string='sasuser work dictionary'; output;
  5. run;
复制代码
第一行数据包含 7z,它不满足SAS逻辑库命名规则3,第三行数据包含 dictionary,它不满足SAS逻辑库命名规则1。因此,以上数据需分别返回 1,0,1 作为各自的结果。

请问该正则表达式是否可以被构造?

关键词:正则表达式 如何使用 逻辑库 表达式 字符串
已有 1 人评分经验 收起 理由
dxystata + 100 鼓励积极发帖讨论

总评分: 经验 + 100   查看全部评分

查看我的精华帖:免费的 SAS 软件

沙发
learsaas 发表于 2022-11-11 10:03:59
  1. data  result ;
  2.         set test;
  3.         length prxid i 8 text $100 flag $1;
  4.         retain prxid;
  5.         if _n_=1 then prxid=prxparse('m/^[a-z_][a-z\d_]{0,7}$/i');
  6.         i=1;
  7.         flag=ifc(scan(string,i,'')='','1','0');
  8.         do while(scan(string,i,'') ne '');
  9.                 text=strip(scan(string,i,''));
  10.                 if prxmatch(prxid,trim(text))=0 then do;
  11.                         flag='1';
  12.                         leave;
  13.                 end;
  14.                 i=i+1;
  15.         end;
  16.         drop prxid i text;
  17. run;
复制代码

藤椅
learsaas 发表于 2022-11-11 16:18:46
  1. data  result ;
  2.         set test;
  3.         length prxid i 8 text $100 flag $1;
  4.         retain prxid;
  5.         if _n_=1 then prxid=prxparse('m/^[a-z_][a-z\d_]{0,7}$/i');
  6.         i=1;
  7.         flag=ifc(scan(string,i,'')='','1','0');
  8.         do while(scan(string,i,'') ne '');
  9.                 text=strip(scan(string,i,''));
  10.                 if prxmatch(prxid,trim(text))=0 then do;
  11.                         flag='1';
  12.                         leave;
  13.                 end;
  14.                 i=i+1;
  15.         end;
  16.         drop prxid i text;
  17. run;
复制代码
已有 1 人评分论坛币 热心指数 收起 理由
whymath + 3 + 3 鼓励积极发帖讨论

总评分: 论坛币 + 3  热心指数 + 3   查看全部评分

板凳
whymath 发表于 2022-11-11 16:56:14
  1. data test;
  2.   input string $42.;
  3.   x=^^prxmatch('/(?:\s|\b)(?![A-Za-z_][A-Za-z0-9_]{0,7}\s)\S+\b/',string);
  4.   put x=;
  5.   cards;
  6. sasuser
  7. sasuser work sashelp
复制代码
已有 1 人评分经验 学术水平 收起 理由
dxystata + 100 + 1 鼓励积极发帖讨论

总评分: 经验 + 100  学术水平 + 1   查看全部评分

报纸
learsaas 发表于 2022-11-14 14:59:33
whymath 发表于 2022-11-11 16:56
(sasuser会误判

地板
learsaas 发表于 2022-11-14 15:05:40
whymath 发表于 2022-11-11 16:56
(sasuser会误判

7
learsaas 发表于 2022-11-14 15:37:55
whymath 发表于 2022-11-11 16:56
(sasuser会误判!sasuser work sashelp也会误判

8
whymath 发表于 2022-11-15 09:19:18
learsaas 发表于 2022-11-14 15:37
(sasuser会误判!sasuser work sashelp也会误判
1.png
查看我的精华帖:免费的 SAS 软件

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-17 16:47