【发布时间】:2021-11-19 14:33:45
【问题描述】:
有效的字符串应该由西里尔字符或拉丁字符组成。
我用 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
由于某种原因,第二个正则表达式总是成功。
【问题讨论】: