gpt4 book ai didi

regex - Perl 模式匹配与模式算术

转载 作者:行者123 更新时间:2023-12-04 22:22:26 25 4
gpt4 key购买 nike

我想了解如何在 perl 正则表达式中对匹配的子模式进行算术运算。
这只是一个示例代码,我想了解如何使用 \1 (已经匹配子模式。在这种情况下 - 7)匹配pattern+1 (8)

my $y = 77668;
if($y =~ /(\d)\1(\d)\2\1+1/) #How to increment a previously
#matched sub-pattern and form a pattern?
{
print $y;
}

编辑

从答案中,我看到模式算术是不可能的。

这就是我想要实现的。
我想形成一个匹配这个模式的正则表达式:
N-3N-2N-1NNN+1N+2N+3    (N = 3,4,5,6

最佳答案

它可以通过正则表达式代码块:

my $y = 77668;
if($y =~ /(\d)\1(\d)\2(??{$1+1})/ ) {
print $y;
}

在这个片段中, (??{ CODE }) 返回另一个必须匹配的正则表达式,所以这个正则表达式看起来像“8”($1+1)。结果,整个正则表达式只有在第 5 位更大且第 1 位加 1 时才会匹配。但是第 1 位的缺点是 9,此代码块将返回“10”,因此可能是错误的行为,但你没有说什么必须是在这种情况下完成。

现在关于 N-3N-2N-1NNN+1N+2N+3 问题,您可以将其与此正则表达式匹配:
my $n = 5;
if( $y =~ /(??{ ($n-3).($n-2).($n-1).$n.($n+1).($n+2).($n+3) })/ ){

或更“可扩展”的方式:
my $n = 5;
if( $y =~ /(??{ $s=''; $s .= $n+$_ foreach(-3..3); $s; })/ ){

同样,如果 $n == 2 我们必须做什么? $n-3 将是-1。它不是一个简单的数字,它有符号,所以你应该考虑这种情况。

另一种方式。匹配我们拥有的,然后检查它。
if( $y =~ /(\d)(\d)(\d)(\d)(\d)(\d)(\d)/ ) {
if( $1 == ($4-3) && $2 == ($4-2) && $3 == ($4-1) && $6 == ($4+1) && $7 == ($4+2) && $7 == ($4+3) ) {
#...

似乎这种方法有点笨拙,但对每个人来说都是显而易见的(我希望)。

此外,您可以优化您的正则表达式,因为 7 个升序数字连拍并不是那么频繁的组合,另外还可以从同事 xD 那里获得一些 lulz:
sub check_number {
my $i;
for($i=1; $i<length($^N); $i++) {
last if substr($^N, $i, 1)<=substr($^N, $i-1, 1);
}
return $i<length($^N) ? "(*FAIL)" : "(*ACCEPT)";
}

if( $y =~ /[0123][1234][2345][3456][4567][5678][6789](??{ check_number() })/ ) {

或者...也许是最人性化的 方法:
if( $y =~ /0123456|1234567|2345678|3456789/ ) {

似乎最后一个变体是 bingo xD 它是关于在事情如此简单时不搜索正则表达式的好例子)

关于regex - Perl 模式匹配与模式算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324195/

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