perl交换两个字

时间:2012-06-18 21:53:56

标签: regex perl

美好的一天,

我在Perl中有一个简单的工作例程,可以交换两个单词:

即。 John Doe -----> Doe John

这是:

sub SwapTokens()
{
    my ($currentToken) = @_;

    $currentToken =~ s/([A-Za-z]+) ([A-Za-z]+)/$2 $1/;
    # $currentToken =~ s/(\u\L) (\u\L)/$2 $1/;
    return $currentToken;
} 

以下用法完全符合我的要求:

print &SwapTokens("John Doe");

但当我取消注释'$ currentToken = ~s /(\ u \ L)(\ u \ L)/ $ 2 $ 1 /;

这一行时

我收到错误。我错过了什么,看起来我的语法是正确的。

TIA,

COSON

3 个答案:

答案 0 :(得分:5)

\u不是与大写字母匹配的正则表达式原子。 \L不是与大量小写字母匹配的正则表达式原子。你正在寻找

s/(\p{Lu}\p{Ll}+) (\p{Lu}\p{Ll}+)/$2 $1/;

\p{Lu}  Uppercase letter.
\p{Ll}  Lowercase letter.

$ unichars '\p{Lu}' | head -n 5
 A  U+0041 LATIN CAPITAL LETTER A
 B  U+0042 LATIN CAPITAL LETTER B
 C  U+0043 LATIN CAPITAL LETTER C
 D  U+0044 LATIN CAPITAL LETTER D
 E  U+0045 LATIN CAPITAL LETTER E

$ unichars '\p{Ll}' | head -n 5
 a  U+0061 LATIN SMALL LETTER A
 b  U+0062 LATIN SMALL LETTER B
 c  U+0063 LATIN SMALL LETTER C
 d  U+0064 LATIN SMALL LETTER D
 e  U+0065 LATIN SMALL LETTER E

答案 1 :(得分:5)

也许你正在寻找这样的东西:

sub swap_the_words {
  my ($processed_string) = @_;
  $processed_string =~ s/([A-Z][A-Za-z]+) ([A-Z][A-Za-z]+)/$2 $1/;
  return $processed_string;
}
print swap_the_words('John Doe'); # prints Doe John

至于\u\l,它们适合修改字符串 - 而不是正则表达式。例如,您可以稍微改变您的脚本......

  $processed_string =~ s/([a-z]+) ([a-z]+)/\u\L$2\E \u\L$1\E/i;
  ...
  print swap_the_words('cOsOn hAcKeR'); # Hacker Coson

...所以你的话语不仅会被交换,而且还会给出正确的案例。但请注意,这些修饰符用于s///运算符的替换部分。

答案 2 :(得分:-4)

\L表示"lowercase till \E";即,\E需要在某个时刻跟踪它。您的正则表达式中没有\E,因此它无效;在每个\E之后添加\L得到要编译的脚本,但我不知道你实际上想要在那里完成什么。