【问题标题】:SAS - extract 8-digit pattern with regex / prxmatchSAS - 使用 regex / prxmatch 提取 8 位模式
【发布时间】:2019-11-13 04:19:12
【问题描述】:

从 SAS 中的现有字符串中提取格式为 yyyymmdd 的日期戳的最佳方法是什么?

根据我的阅读,最简单的方法似乎是使用带有prxmatch 函数的正则表达式来替换所有模式。

  • 假设字符串中唯一的 8 位模式是我的日期,所以 [0-9]{8} 模式就足够了。

这是我用字符串 empty 替换 8 位模式的内容(为了便于阅读):

data b(keep=have want);

    /* HAVE */
   have = '&libroot_hr./import/sxh3j900/20190702_SXH3J900_DWH_Adresse.txt';
   regexp = 's/[0-9]{8}/empty/';
   times  = -1;  /* -1: replace all occurences */

    /* WANT */
   want = prxchange(regexp, times, have);

   /* Result
       '&libroot_hr./import/sxh3j900/empty_SXH3J900_DWH_Adresse.txt'
   */

run;

我怎样才能改变这个,所以它用字符串empty替换所有任何9位数的模式?

【问题讨论】:

  • 字符串可以有多个 8 位的字符串吗? 8位数字的字符串是否需要独立于其他数字?还是要匹配较长数字字符串中的 8 位数字?
  • 假设字符串中唯一的 8 位模式是我的日期。日期字符串将被非数字字符包围。会有其他数字(在我的示例中为3900),但没有其他8 个或更多连续数字的字符串。因此[0-9]{8} 应该足以找到我的字符串(但我需要反向并找到所有 but 所说的字符串)
  • 那为什么不直接把日期字符串取出来写回变量呢?
  • 你的意思是像 Aurieli 的解决方案?我还不太确定什么时候使用哪个 prx-function... 来测试一下!

标签: regex sas


【解决方案1】:
data b(keep=have want);
   have='&libroot_hr./import/sxh3j900/20190702_SXH3J900_DWH_Adresse.txt';
   re = prxparse("/(\d{8})/"); 
   if prxmatch(re,have) then do;
      want = prxposn(re,0,have);
   end;
run;

如果你只想提取前 8 位数字。

Here 将正则表达式转为 yyyymmdd 格式。

【讨论】:

  • 感谢您的回答。将对其进行测试-在第一次测试中看起来很有希望...我会在测试后立即标记答案:)
  • @MartinDreher 我建议你使用正则表达式:"/((19\d{2})|(2\d{3}))(\d{2})(\d{2 })/",我认为它比 "/(\d{8})/" 更好:)
  • 自然地,我在尝试理解您的解决方案时只使用了“/(\d{8})/”作为更简单的代码。顺便说一句,它就像一个魅力。谢谢老兄!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多