正则表达式:我怎样才能避免使用字符类?

标签 regex perl

是否可以在不使用 [^...] 而使用 \P{...} 的情况下编写此代码?

#!/usr/bin/env perl 
use warnings;
use 5.012;
use utf8;

my $string = '_${Hello}?${World}!';

$string =~ s/[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}]/-/g; 

say "<$string>";

最佳答案

好吧,这可能但我不认为我会称之为改进:

#!/usr/bin/env perl
use warnings;
use 5.012;
use utf8;

my $string = '_${Hello}?${World}!';

$string =~ s/(?=\P{Alphabetic})
             (?=\P{Mark})
             (?=\P{Decimal_Number})
             (?=\P{Connector_Punctuation}) . /-/xgs;

say "<$string>";

有了多重积极的前瞻性,他们都必须成功。因此它匹配一个字符(.),它不是 Alphabetic 也不是 Mark 也不是 Decimal_Number 也不是 Connector_Punctuation,就像取反字符类一样。

我添加了 /s 修饰符,因为原始正则表达式会匹配换行符(尽管您的示例字符串没有换行符)。我添加了 /x 这样我就可以添加一些空格并将它分成多行。

无论如何,你有什么反对字符类的?

关于正则表达式:我怎样才能避免使用字符类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631499/

相关文章:

php - 天花板函数的 PHP 代码

perl - 用 Perl 解析 AVI 视频

Java::用正则表达式解析多行文本

ios - 如何在 NSString 中捕获特殊指示的**字符**并加粗中间的内容?

javascript - [][] 如何在正则表达式中解析?

multithreading - 尝试处理 100 个 URL 请求。我应该使用 perl CPAN HTTP::Async 吗?魔力?

python - gVim 和多种编程语言

javascript - 要检查的正则表达式 - 不超过 2 个连续数字或字符,并且不超过 1 个相同数字或字符 - Javascript

python - Python 与 Perl 正则表达式中的反斜杠和转义字符

php - 为什么 PHP 中的字符串连接使用句号 "."而不是加号 "+"?