2012-07-11 39 views
0

我是新来的红宝石和正则表达式,并试图找出如何攻击将附加的棒球运动员字符串分为姓/名组合。如何用正则表达式分割名称?

这是一个示例字符串:

"JohnnyCuetoJ.J.PutzBrianMcCann" 

这是所需的输出:

Johnny Cueto 
J.J. Putz 
Brian McCann 

我已经找到了如何用大写字母来分隔这让我接近,但异常的名称,如J.J.McCann混乱的模式。任何人都有想法解决这个问题的最佳方法?

+3

它看起来像你的数据缺少一些分隔符,你应该看看为什么。数据来自哪里?你在刮网页吗? – 2012-07-11 17:52:23

+0

当你将这些名字混合在一起时,你应该如何猜测哪些名字属于一起组成一个人?在这个世界上有一些人,从一个到四个或更多的名字部分。 – 2012-07-11 21:25:17

回答

1

如果你不必在一个单一的gsub中做,它会变得更容易一些。

string = "JohnnyCuetoJ.J.PutzBrianMcCann" 
string.gsub!(/([A-Z][^A-Z]+)/, '\1 ') # separate by capital letters 
string.gsub!(/(\.) ([A-Z]\.)/, '\1\2') # paste together "J. J." -> "J.J." 
string.gsub!(/Mc /, 'Mc') # Remove the space in "Mc " 
string.strip # Remove the extra space after "Cann " 

...当然,你可以把这个通过级联gsub调用单行线,但基本上会杀了代码的可读性(但另一方面,如何可读性是块regexen呢?)

+0

太棒了!感谢弗罗斯特。从概念上讲,因为我可能的字符串将会成为大联盟的每一个球员,你认为一个正则表达式是可以实现的,不需要有特定的球员步骤,比如你为麦肯所做的一切? – BC00 2012-07-11 18:01:57

+0

我还可以在哪里学习gsub方法的替换参数中使用的语法?不确定'\ 1'是干什么的。 – BC00 2012-07-11 20:12:37

+0

不要忘记拥有像奥康纳和奥尼尔这样的爱尔兰名字的球员。我相信还有其他特殊情况你也需要处理。 – 2012-07-11 21:17:51