gpt4 book ai didi

regex - SAS : How do I find nth instance of a character/group of characters within a string?

转载 作者:行者123 更新时间:2023-12-02 15:18:54 25 4
gpt4 key购买 nike

我试图找到一个函数来索引字符的第 n 个实例。

例如,如果我有字符串 ABABABBSSSDDEE 并且我想找到 A 的第三个实例,我该怎么做?如果我想找到 AB

的第 4 个实例怎么办?

ABABABBABSSDDEE

data HAVE;
input STRING $;
datalines;
ABABABBASSSDDEE
;
RUN;

最佳答案

下面是使用 SAS find() 函数查找 SAS 字符串中一组字符的第 N 个实例的简化实现:

     data a;
s='AB bhdf +BA s Ab fs ABC Nfm AB ';
x='AB';
n=3;

/* from left to right */
p = 0;
do i=1 to n until(p=0);
p = find(s, x, p+1);
end;
put p=;

/* from right to left */
p = length(s) + 1;
do i=1 to n until(p=0);
p = find(s, x, -p+1);
end;
put p=;
run;

如您所见,它支持从左到右和从右到左的搜索。

您可以将这两个组合成一个 SAS 用户定义函数(负数 n 表示从右到左搜索,就像在 find 函数中一样):

     proc fcmp outlib=sasuser.functions.findnth;
function findnth(str $, sub $, n);
p = ifn(n>=0,0,length(str)+1);
do i=1 to abs(n) until(p=0);
p = find(str,sub,sign(n)*p+1);
end;
return (p);
endsub;
run;

请注意,上述使用 FIND() 和 FINDNTH() 函数的解决方案假设搜索到的子字符串可以与其先前的实例重叠。例如,如果我们在字符串“ABAAAA”中搜索子字符串“AAA”,那么“AAA”的第一个实例将在位置 3 中找到,第二个实例 - 在位置 4 中。也就是说,第一个和第二个实例是重叠的。出于这个原因,当我们找到一个实例时,我们将位置 p 增加 1 (p+1) 以开始搜索的下一次迭代(实例)。但是,如果这种重叠在您的搜索中不是有效的情况,并且您想在前一个子字符串实例结束后继续搜索,那么我们不应该将 p 增加 1,而是增加子字符串 x 的长度。这将加快我们的搜索速度(子字符串 x 越长),因为我们将在遍历字符串 s 时跳过更多字符。在这种情况下,在我们的搜索代码中,我们应该将 p+1 替换为 p+w,其中 w=length(x)。

我最近的 SAS 博文 Finding n-th instance of a substring within a string 中描述了这个问题的详细讨论。 .我还发现使用 find() 函数比在 SAS 中使用正则表达式函数要快得多。

关于regex - SAS : How do I find nth instance of a character/group of characters within a string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38755610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com