gpt4 book ai didi

regex - 我们应该考虑将范围 [a-z] 用作错误吗?

转载 作者:行者123 更新时间:2023-12-02 13:13:06 25 4
gpt4 key购买 nike

在我的语言环境 (et_EE) [a-z]方法:

abcdefghijklmnopqrsšz

因此,不包括 6 个 ASCII 字符 ( tuvwxy ) 和一个来自爱沙尼亚字母 ( ž ) 的字符。我看到很多模块仍在使用正则表达式,例如
/\A[0-9A-Z_a-z]+\z/

对我来说,定义 ASCII 字母数字字符范围的方法似乎是错误的,我认为应该将其替换为:
/\A\p{PosixAlnum}+\z/

第一个仍然被认为是惯用的方式吗?或接受的解决方案?还是一个错误?

或者最后一个有一些警告?

最佳答案

如果这正是您想要的,那么使用 [a-z]没有错。
但认为英语单词仅由 [a-zA-Z] 组成是错误的。或 [a-zäöüßA-ZÄÖÜ] 的德语或名称后跟[A-Z][a-z]* .
如果我们想要任何语言或书写系统中的单词(针对 2,300 种语言进行测试,每 50 K 最常见的单词),我们可以使用如下内容:

#!perl

use strict;
use warnings;
use utf8;

use 5.020; # regex_sets need 5.18

no warnings "experimental::regex_sets";

use Unicode::Normalize;

my $word_frequencies = {};

while (my $line = <>) {
chomp $line;
$line = NFC($line);

# NOTE: will catch "broken" words at end/begin of line
# and abbreviations without '.'
my @words = $line =~ m/(
(?[ \p{Word} - \p{Digit} + ['`´’] ])
(?[ \p{Word} - \p{Digit} + ['`´’=⸗‒—-] ])*
)/xg;

for my $word (@words) {
$word_frequencies->{$word}++;
}
}

# now count the frequencies of graphemes the text uses

my $grapheme_frequencies = {};
for my $word (keys %{$word_frequencies}) {
my @graphemes = m/(\X)/g;
for my $grapheme (@grapheme) {
$grapheme_frequencies->{$grapheme}
+= $word_frequencies->{$word};
}
}
对于更窄的检查,我们可以查看 \p{Word} 的定义。在 Unicode 标准中 https://unicode.org/reports/tr18/#word
word
\p{alpha}
\p{gc=Mark}
\p{digit}
\p{gc=Connector_Punctuation}
\p{Join_Control}

基于 \p{Word}我们现在可以为例如定义一个正则表达式 words在拉丁文字中:
# word:
\p{Latin} # \p{alpha}
\p{gc=Mark}
# \p{digit} # we don't want numerals in words
\p{gc=Connector_Punctuation}
\p{Join_Control}

关于regex - 我们应该考虑将范围 [a-z] 用作错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11925537/

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