gpt4 book ai didi

regex - Perl 单元 2 正则表达式为 1

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

一个有效的字符串应该包含西里尔字符或仅包含拉丁字符。

我用 2 个正则表达式创建了一个有效的解决方案。但是当我试图将它们合并为 1 时,它失败了:

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use v5.14;
use open ':std', ':encoding(UTF-8)';

my @data = (
# rus - ok
"абвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ",
# space
"а бвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ",
# rus - latin
"аtбвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ",
# digit
"аб2вгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ",
# latin - ok
"abcdefghejklmnopqrstuvwxyzABCDEFGHEJKLMNOPQRSTUVWXYZ",
# space
"a bcdefghejklmnopqrstuvwxyzABCDEFGHEJKLMNOPQRSTUVWXYZ",
# underscore
"a_bcdefghejklmnopqrstuvwxyzABCDEFGHEJKLMNOPQRSTUVWXYZ",
# digit
"a2bcdefghejklmnopqrstuvwxyzABCDEFGHEJKLMNOPQRSTUVWXYZ"
);

foreach(@data) {
if ($_ =~ /^[а-яё]+$/i or $_ =~ /^[a-z]+$/i) {
print "ok\n";
}
else {
print "bad\n";
}
}

print "-------\n";
foreach(@data) {
if ($_ =~ /^(:?[а-яё]+)|(:?[a-z]+)$/i) {
print "ok\n";
}
else {
print "bad\n";
}
}

输出:

ok
bad
bad
bad
ok
bad
bad
bad
-------
ok
ok
ok
ok
ok
ok
ok
ok

出于某种原因,第二个正则表达式总是成功。

最佳答案

在你的正则表达式中,

  • :? - 匹配一个可选的 : 而你想定义一个 non-capturing group , (?:...)
  • ^(?:a+)|(?:b+)$ - 匹配字符串开头的 ab s 在字符串的末尾。

你应该使用

/^(?:[а-яё]+|[a-z]+)$/i

参见 regex demo . 详细信息:

  • ^ - 字符串的开始
  • (?: - 非捕获组的开始
    • [а-яё]+ - 一个或多个俄语字母
    • | - 或者
    • [a-z]+ - 一个或多个 ASCII 字母
  • ) - 非捕获组结束
  • $ - 字符串结尾。

注意:从 Perl 5.22 开始,您可以使用 n modifier要使捕获组表现为非捕获组,/^([а-яё]+|[a-z]+)$/ni。因此,不存在混合 ?::? 的风险。

在本例中使用use v5.22.0;检查核心版本。

关于regex - Perl 单元 2 正则表达式为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69346670/

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