gpt4 book ai didi

regex - 将包含重音字符的字符串大写

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

我正在尝试找到在 perl webapp 中大写名称的解决方案(使用 perl v5.10.1)。我最初想使用 Lingua::EN::NameCase,但发现重音字符存在一些问题。

我需要能够处理来自各种欧洲语言(爱尔兰语、法语、德语)的重音字符。

我在网上看到一些迹象表明 Lingua::EN::NameCase 应该适用于我的用例。例如,perlmonks 上的这个页面:http://www.perlmonks.org/?node_id=889135

这是我基于上述链接的测试代码:

#!/usr/bin/perl

use strict;
use warnings;
use Lingua::EN::NameCase;
use locale;
use POSIX qw(locale_h);

my $locale = 'en_FR.utf8';

setlocale( LC_CTYPE, $locale );

binmode DATA, ':encoding(UTF-8)';
binmode STDOUT, ':encoding(UTF-8)';

while (my $original_name = <DATA>) {
chomp $original_name;
my $normalized_name = nc($original_name);
printf "%30s L::EN::NC %30s UCFIRST %30s\n", $original_name, $normalized_name, xlc($original_name);
}

sub xlc {
my $str = shift;
$_ = lc( $str );
return join q{} => ( map { ucfirst(lc($_)) } ( $str =~ m/(\W+|\w+)/g ) );
};

__DATA__
ÉTIENNE DE LA BOÉTIE
ÉMILIE DU CHÂTELET
HÉLÈNE CIXOUS
Seán Ó Hannracháín
Máire Ó hÓgartaigh

产生下面的输出。 L::EN::NC 和自定义 ucfirst(lc()) 解决方案都会产生不正确的结果(注意每个重音字符后面的大写字母)。这似乎是因为 perl regex 在每个重音字符之前/之后匹配“单词边界”。我希望单词边界只能在空格字符和非空格字符之间匹配。

有人可以提出解决方案吗?

谢谢,

布莱恩。
  ÉTIENNE DE LA BOÉTIE L::EN::NC           éTienne de la BoéTie UCFIRST           ÉTienne De La BoÉTie
ÉMILIE DU CHÂTELET L::EN::NC éMilie du ChâTelet UCFIRST ÉMilie Du ChÂTelet
HÉLÈNE CIXOUS L::EN::NC HéLèNe Cixous UCFIRST HÉLÈNe Cixous
Seán Ó Hannracháín L::EN::NC SeáN ó HannracháíN UCFIRST SeÁN ó HannrachÁíN
Máire Ó hÓgartaigh L::EN::NC MáIre ó HóGartaigh UCFIRST MÁIre ó HÓGartaigh

最佳答案

Perl 5.10 太旧了;如果可以,你应该更新它。

接下来,您将找到我用于类似情况的版本。 (在 perl 5.14.2 中测试)

#!/usr/bin/perl

use strict;
use warnings;
use utf8::all;

while (<DATA>) { chomp;
printf "%30s ==> %30s\n", $_, xlc($_);
}

sub xlc { my $str = shift;
$str =~ s/(\w+)/ucfirst(lc($1))/ge;
$str =~ s/( L[ea]s?
| Von
| D[aeou]s?
)\b
/lc($1)/xge;
return $str;
};

__DATA__
ÉTIENNE DE LA BOÉTIE
ÉMILIE DU CHÂTELET
HÉLÈNE CIXOUS
Seán Ó Hannracháín
Máire Ó hÓgartaigh

关于regex - 将包含重音字符的字符串大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19396804/

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