regex - 带有特殊字符的字母顺序 perl

标签 regex perl

我有这组代码:

 use strict; 
 use warnings; 
 my %hash = ( 5328 => 'Adorable', 
              26191 => '"Giraffe"', 
              57491 => 'Is Very', 
               4915 => 'Cute',);
 foreach (sort { ($hash{$a} cmp $hash{$b}) || ($a cmp $b) } keys %hash) 
 { print "$hash{$_}\n"; }

这将导致:
"Giraffe"

Adorable

Cute

Is Very

我需要按字母顺序排序,并忽略 AlphaNumeric 字符之前的特殊字符,如本示例中所示:
Adorable

Cute

"Giraffe"

Is Very

有什么建议?

最佳答案

您可以简单地这样做(请注意,我将第二个 cmp 更改为用于数值的穿梭运算符 <=>):

foreach (sort { ($hash{$a}=~s/^\W+//r cmp $hash{$b}=~s/^\W+//r) || ($a <=> $b) } keys %hash) {
    print "$hash{$_}\n";
}

但是如果你有很多数据,最好转换你的数据(一劳永逸):
例如使用施瓦兹变换:
my @result = map { $_->[2] }
             sort { ($a->[0] cmp $b->[0]) || ($a->[1] <=> $b->[1]) }
             map { [ $hash{$_}=~s/^"|"$//gr, $_, $hash{$_}] } keys %hash; 

print join "\n", @result;

关于regex - 带有特殊字符的字母顺序 perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41557647/

相关文章:

c# - 去除非 ascii 字符但允许货币符号

java - 为什么 replaceAll 不起作用?

regex -//和 m//之间有什么区别吗?

perl - 将 `use` 更改为 `require` 后,如何处理导入?

perl - Perl 5.16.3 和 5.8.7 中的 float 精度差异

javascript - 解析 YouTube URL

java - Struts2 验证不仅仅适用于正则表达式

java - 如何使用正则表达式分割行

perl - 机械化示例 - 安静简单但对我来说太复杂 : need explanations

string - 在 Perl 中用尾随零扩展字符串