【问题标题】:How do I reverse the order of two words in a string?如何颠倒字符串中两个单词的顺序?
【发布时间】:2010-07-08 14:31:53
【问题描述】:

我有一个这样的字符串:

$a = "Mike , Tree "; 

我想将其反转为"Tree, Mike"

有什么功能可以做到吗?

【问题讨论】:

  • 我不知道我可以接受哪个答案..因为两个答案都很好...
  • 更改后的空格重要吗?
  • 那么两个答案都缺少逗号和第二个单词之间的空格。

标签: perl


【解决方案1】:

将字符串分成两个字符串,翻转它们,然后重新加入。

或者,使用正则表达式:

$a =~ s/(.+),(.+)/\2,\1/g;

【讨论】:

  • 从我的角度来看,比 Roque 的答案更好,因为正则表达式允许您更好地控制如何处理额外空间。在你的情况下,我会做 $a =~ s/(\S+)\s*,\s*(\S+)/\2, \1/g;
  • \1 等替换端已被长期弃用,将触发警告;改为:$a =~ s/(.+),(.+)/$2,$1/g;
  • g 修饰符在这里似乎是多余的,不是吗?
  • @radius: 在流氓的回答中,您仍然可以使用正则表达式来替换空格,但如果您要使用正则表达式,您可以一次性完成所有操作步骤。
【解决方案2】:

使用reverse函数:

$reversed = join(",", reverse split(",", $string));

【讨论】:

  • 嘿,这是 perl 中的一个奇特功能......我喜欢。
  • 此示例代码未在标量上下文中使用反向函数。
  • 不错..看起来很“实用”。 :)
【解决方案3】:

如果您保证要反转的字符串将用逗号分隔,那么我会在逗号处拆分字符串,然后遍历它产生的数组,从它的长度到 0 并将其附加到空字符串。

【讨论】:

    【解决方案4】:

    只为解决您的问题。

    $a =~ s/([A-Za-z]+)([^A-Za-z]+)([A-Za-z]+)/$3$2$1/;
    
    [JJ@JJ trunk]$ perl -E '$a = "Mike , Tree "; $a =~ s/([A-Za-z]+)([^A-Za-z]+)([A-Za-z]+)/$3$2$1/; say $a;'
    Tree , Mike
    

    【讨论】:

      最近更新 更多