Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用正则表达式匹配字符串中相同长度的数字_Regex_Nsregularexpression - Fatal编程技术网

Regex 如何使用正则表达式匹配字符串中相同长度的数字

Regex 如何使用正则表达式匹配字符串中相同长度的数字,regex,nsregularexpression,Regex,Nsregularexpression,我想在包含数字和字符的字符串中查找文本(例如:stack)(例如:s123t123a123c123k)。唯一的规则是,搜索键的每个字符之间应该有相同数量的数字,因此所有这些数字都应该匹配: search key: stack Strings: stack //0 digit between chars of stack s7t3a9c0k //1 digit between chars of stack s27t33a49c50k

我想在包含数字和字符的字符串中查找文本(例如:stack)(例如:s123t123a123c123k)。唯一的规则是,搜索键的每个字符之间应该有相同数量的数字,因此所有这些数字都应该匹配:

search key: stack

Strings:
stack                  //0 digit between chars of stack
s7t3a9c0k              //1 digit between chars of stack
s27t33a49c50k          //2 digit between chars of stack
s127t312a229c330k      //3 digit between chars of stack and so on for 4,5,6 digits...
如果我可以匹配相同长度的数字,那么如果相同长度的数字的正则表达式是[],我可以写:s[]*t[]*a[]*c[]*k。
如何使用正则表达式匹配字符串中相同长度的数字?

如果要使用Perl进行匹配,可以使用

m/s(\d+)t(??{ "\\d{".length($^N)."}" })a(??{ "\\d{".length($^N)."}" })c(??{ "\\d{".length($^N)."}" })k/
或者,如果要将数字与
[0-9]
匹配:

m/s([0-9]+)t(??{ "[0-9]{".length($^N)."}" })a(??{ "[0-9]{".length($^N)."}" })c(??{ "[0-9]{".length($^N)."}" })k/
在Perl代码中,您很可能希望动态构建模式。请参阅完整的Perl代码演示:

#!/usr/bin/perl
use warnings;
use strict;
use re 'eval'; # stackoverflow.com/a/16320570/3832970

my @input = split /\n/, <<"END";
s7t3a9c0k
s27t33a49c50k
s127t312a229c330k
s1t312a22c3300k
END

my $keyword = "stack";
my $pattern = substr($keyword, 0, 1) . '([0-9]+)' . join( '(??{ "[0-9]{".length($^N)."}" })', split("", substr($keyword, 1)) );
#my $pattern = substr($keyword, 0, 1) . '(\d+)' . join( '(??{ "\\\\d{".length($^N)."}" })', split("", substr($keyword, 1)) );
for my $input ( @input ) {
    if ($input =~ m/$pattern/) {
        print $input . ": PASS!\n";
    } else {
        print $input . ": FAIL!\n"
    }
}
$pattern
是动态构建的:
substr($keyword,0,1)
获取第一个字符,然后添加
([0-9]+)
,然后
join(“(?{[0-9]{.length($^N)。“}”)、split(“,substr($keyword,1))
添加以下内容:插入
(?{[0-9]{.length($^N)。“}”)
位于第二个字符的
$关键字
子字符串的每个字符之间。
(?{[0-9]{.length($^N)。“}”)部分充当
\d{X}
模式,其中
X
是最近捕获的子字符串的长度(它是
([0-9]+)


使用re'eval';
是动态构建模式所必需的。根据,它只会影响文件中的正则表达式或使用它的卷曲中的正则表达式。

只需以编程方式执行-匹配所有数字,计算每个组的长度,就完成了。正则表达式不用于计算(除非事先指定长度,例如,
x{3}
)。对于Perl,可以使用“推迟”正则子表达式。嗨,我的答案对你有用吗?不是真的,我需要一个没有编程,只有正则表达式的解决方案。但我认为这是不可能的。无论如何,谢谢。对了,唯一的正则表达式解决方案就像我下面的答案一样。
s7t3a9c0k: PASS!
s27t33a49c50k: PASS!
s127t312a229c330k: PASS!
s1t312a22c3300k: FAIL!