当前位置: 首页 > 知识库问答 >
问题:

如何匹配Unicode元音?

公孙辰龙
2023-03-14

什么字符类或Unicode属性将匹配Perl中的任何Unicode元音?

错误答案:[aeiouAEIOU]。(此处布道,洗衣清单中的第24项)

perluniprops只提到朝鲜文和印度文的元音。

让我们把元音是什么的问题放在一边。是的,i在某些上下文中可能不是元音。所以,任何可以是元音的字符都可以。


共有3个答案

壤驷德寿
2023-03-14
匿名用户

撇开元音的定义和不同语言共享符号但使用不同的明显问题不谈,您可以定义自己的属性以在Perl模式中使用。

在或Is中定义以开头的子例程,并指定其中可以包含的字符。最简单的是一个代码行,或一系列由水平空格分隔的代码:

#!perl
use v5.10;
use utf8;
use open qw(:std :utf8);

sub InSpecial {
    return <<"HERE";
00A7
00B6
2295\t229C
HERE
}


$_ = "ABC\x{00A7}";

say $_;
say /\p{InForeign}/ ? 'Matched' : 'Missed';

颜修明
2023-03-14

首先,并非所有书面语言都有“元音”。(例如,中文 (Zhōngwén)(书面汉语)不是,因为它是表意文字而不是语音。另一个例子是,日本人大多不这样做;它主要使用辅音元音平假名或片假名音节,如“ga”、“wa”、“tsu”)

一些书面语言(例如印地语、孟加拉语、希腊语、俄语)确实有元音,但使用的字符不容易映射到aeiou。对于这些语言,您必须找到(搜索Metaspan?)或者制作查找表,指定哪些字母是“元音”。

但是,如果您处理的是任何基于拉丁字母(abcdeghijklmnopqrstuvwxyz)的书面语言,即使该语言使用大量变音符号(在Perl和Unicode圈子中称为“组合标记”)(例如,越南语),您可以轻松地将它们映射到“元音”或“非元音”,是的。方法是“规范化到完全分解形式”,然后去掉所有组合标记,然后折叠大小写,然后将每个字母与regex/[aeiou]/进行比较。以下Perl脚本将使用基于拉丁的字母表找到任何语言中的大部分或全部“元音”:

#!/usr/bin/perl -CSDA
# vowel-count.pl
use v5.20;
use Unicode::Normalize 'NFD';
my $vcount;
while (<>)
{
   $_ =~ s/[\r\n]+$//;
   say "\nRaw string: $_";
   my $decomposed = NFD $_;
   my $stripped = ($decomposed =~ s/\pM//gr);
   say "Stripped string: $stripped";
   my $folded = fc $stripped;
   my @base_letters = split //, $stripped;
   $vcount = 0;
   /[aeiou]/ and ++$vcount for @base_letters;
   say "# of vowels: $vcount";
}
万俟招
2023-03-14

没有这样的财产。

$ uniprops --all a
U+0061 <a> \N{LATIN SMALL LETTER A}
    \w \pL \p{LC} \p{L_} \p{L&} \p{Ll}
    AHex POSIX_XDigit All Alnum X_POSIX_Alnum Alpha X_POSIX_Alpha Alphabetic Any ASCII
       ASCII_Hex_Digit Assigned Basic_Latin ID_Continue Is_IDC Cased Cased_Letter LC
       Changes_When_Casemapped CWCM Changes_When_Titlecased CWT Changes_When_Uppercased CWU Ll L
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Hex X_POSIX_XDigit Hex_Digit IDC ID_Start
       IDS Letter L_ Latin Latn Lowercase_Letter Lower X_POSIX_Lower Lowercase PerlWord POSIX_Word
       POSIX_Alnum POSIX_Alpha POSIX_Graph POSIX_Lower POSIX_Print Print X_POSIX_Print Unicode Word
       X_POSIX_Word XDigit XID_Continue XIDC XID_Start XIDS
    Age=1.1 Age=V1_1 Block=Basic_Latin Bidi_Class=L Bidi_Class=Left_To_Right BC=L
       Bidi_Paired_Bracket_Type=None Block=ASCII BLK=ASCII Canonical_Combining_Class=0
       Canonical_Combining_Class=Not_Reordered CCC=NR Canonical_Combining_Class=NR
       Decomposition_Type=None DT=None East_Asian_Width=Na East_Asian_Width=Narrow EA=Na
       Grapheme_Cluster_Break=Other GCB=XX Grapheme_Cluster_Break=XX Hangul_Syllable_Type=NA
       Hangul_Syllable_Type=Not_Applicable HST=NA Indic_Positional_Category=NA InPC=NA
       Indic_Syllabic_Category=Other InSC=Other Joining_Group=No_Joining_Group JG=NoJoiningGroup
       Joining_Type=Non_Joining JT=U Joining_Type=U Script=Latin Line_Break=AL
       Line_Break=Alphabetic LB=AL Numeric_Type=None NT=None Numeric_Value=NaN NV=NaN
       Present_In=1.1 IN=1.1 Present_In=2.0 IN=2.0 Present_In=2.1 IN=2.1 Present_In=3.0 IN=3.0
       Present_In=3.1 IN=3.1 Present_In=3.2 IN=3.2 Present_In=4.0 IN=4.0 Present_In=4.1 IN=4.1
       Present_In=5.0 IN=5.0 Present_In=5.1 IN=5.1 Present_In=5.2 IN=5.2 Present_In=6.0 IN=6.0
       Present_In=6.1 IN=6.1 Present_In=6.2 IN=6.2 Present_In=6.3 IN=6.3 Present_In=7.0 IN=7.0
       Present_In=8.0 IN=8.0 SC=Latn Script=Latn Script_Extensions=Latin Scx=Latn
       Script_Extensions=Latn Sentence_Break=LO Sentence_Break=Lower SB=LO Word_Break=ALetter WB=LE
       Word_Break=LE

在处理i18n时,最重要的事情是思考您实际需要什么,但您甚至没有提到您正在努力实现什么。

查找元音?这不可能是你真正想要做的。我可以用它来识别一个单词中的元音,但这些元音通常是由多个字母组成的(比如英语中的“oo”,法语中的“in”,“an”/“en”,“ou”,“ai”,“au”/“eau”,“eu”),而且这是特定于语言的。

就目前情况而言,你要求一个全球解决方案,但你用本地术语定义问题。你首先需要定义你试图解决的实际问题。

 类似资料:
  • 问题内容: 在.net中,您可以使用它来匹配任何字母,如何在Python中进行匹配?即,我想匹配任何大写,小写和带重音的字母。 问题答案: Python的模块尚不支持Unicode属性。但是您可以使用该标志编译正则表达式,然后字符类速记也将与Unicode字母匹配。 由于还将匹配数字,因此您需要从字符类中减去数字以及下划线: 将匹配任何Unicode字母。

  • 问题内容: 我有以下仅允许字母的正则表达式: 如何使用p {L}(通用-任何语言,例如德语,英语等)来执行此操作 我试过了 但所有字母a =“ aB”均返回null 问题答案: 从ECMAScript2018开始,JavaScript终于原生支持Unicode属性转义。 对于较旧的版本,您要么需要自己定义所有相关的Unicode范围。或者,您可以将StevenLevithan的程序包与Unicod

  • 问题内容: 有谁知道Mysql的regexp是否支持unicode?我一直在做一些研究,大多数博客等都表明存在问题或不支持。我想知道,最好将LIKE用于unicode模式匹配,将regexp用于ASCII增强模式匹配吗? 我喜欢能够在字符串开头或结尾搜索匹配项的想法,但是如果regexp不支持unicode,那么如果我的文本是unicode,则可能会很困难。 问题答案: 有谁知道Mysql的reg

  • 问题内容: 我正在尝试为PHP中的名称编写一个合理的验证器,而我的第一次尝试包括以下模式: 最终将其传递给的呼叫。据我所知,这可以与您的原始ASCII字母一起使用,但似乎在诸如Ă或张之类的易变字符上起作用。 模式本身有问题吗?也许我期望做的工作比我想象的还要多? 还是与输入的传递方式有关?我不确定是否相关,但是我确实确保在表单页面上指定UTF8编码。 问题答案: 我认为问题要比这简单得多:您忘记了

  • 好的,所以我有一个正则表达式,我试图用它来匹配一些html文件中的特定模式。下面是preg_match语句: 明确地说,这是试图匹配一个id为{ { ALViewElement _ }的html元素。*}}但它也需要以结束标记结束,例如,如果$htmlElementType是“section ”,它将以“/section”结束 如果我的html看起来像这样,里面没有其他内容,那么它就如预期的那样工

  • 问题内容: 在StackOverflow上有很多问题和答案,假设可以在regexp中使用来匹配“字母” 。但是,使用Unicode时,会有更多的字符被大多数人视为字母(所有希腊字母,Cyrllic ..等等)。Unicode定义了许多块,每个块可能都有“字母”。 Java定义 为诸如字母字符之类的东西定义了Posix类,但是被指定为仅与US- ASCII一起使用。预定义的字符类将单词定义为,其中还