perl交换两个字

cos*_*son 1 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;
} 
Run Code Online (Sandbox Code Playgroud)

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

print &SwapTokens("John Doe");
Run Code Online (Sandbox Code Playgroud)

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

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

TIA,

COSON

ike*_*ami 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
Run Code Online (Sandbox Code Playgroud)

  • @ raina77ow,更大的问题是信仰名称遵循这种有限的模式. (2认同)

rai*_*7ow 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
Run Code Online (Sandbox Code Playgroud)

至于\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
Run Code Online (Sandbox Code Playgroud)

...所以你的话不仅要交换,而且还要适当的情况.但请注意,这些修饰符用于s///运算符的替换部分.