有效的字串應僅由西里爾字符或拉丁字符組成。
我用 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
出于某種原因,第二個正則運算式總是成功。
uj5u.com熱心網友回復:
在你的正則運算式中,
:?- 匹配一個可選項,:而您想定義一個非捕獲組,(?:...)^(?:a )|(?:b )$- 匹配a字串開頭的bs或字串末尾的 s。
你應該使用
/^(?:[а-яё] |[a-z] )$/i
請參閱正則運算式演示。詳情:
^- 字串的開始(?:- 非捕獲組的開始[а-яё]- 一個或多個俄文字母|- 或者[a-z]- 一個或多個 ASCII 字母
)- 非捕獲組結束$- 字串的結尾。
注意:從 Perl 5.22 開始,您可以使用n修飾符使捕獲組表現為非捕獲,/^([а-яё] |[a-z] )$/ni. 因此,不會有混合?:和 的風險:?。
use v5.22.0;在這種情況下檢查核心版本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316277.html
上一篇:合并包含散列的perl陣列
