Ruby中的特殊字符串拆分

时间:2010-03-04 12:30:15

标签: ruby split

我正在试图找出最好的方法......

给定一个字符串

s = "if someBool || x==1 && y!=22314" 

我想使用Ruby分隔语句和布尔运算符..所以我想把它分成

["if","someBool","||","x","==","1","&&","y","!=","22314"]

我可以使用s.split(),但这只会将空格作为分界符分割。但我也希望x!= y被拆分(它们是有效的布尔句子,它们之间没有空格良好的可读性)。当然最简单的方法是要求用户在布尔运算符和变量之间放置空格,但有没有其他方法可以做到这一点?

4 个答案:

答案 0 :(得分:4)

在空格或字边界上拆分:

s = "if someBool || x==1 && y!=22314"
a = s.split( /\s+|\b/ );
p a

输出:

["if", "someBool", "||", "x", "==", "1", "&&", "y", "!=", "22314"]

答案 1 :(得分:2)

我的经验法则:如果你知道扔掉什么(分隔符),请使用split,如果你知道要保留什么,请使用正则表达式。在这种情况下,你知道要保留什么(令牌),所以:

s.scan(/ \w+ | (?: \s|\b )(?: \|\| | && | [=!]= )(?: \s|\b ) /x)
# => ["if", "someBool", "||", "x", "==", "1", "&&", "y", "!=", "22314"]

(?: \s|\b )“分隔符”是为了防止您的令牌(例如==)与您不想要的内容匹配(例如!==

答案 2 :(得分:1)

您可以拆分拆分任何您想要的东西,包括正则表达式。类似的东西:

s.split( /\s|==|!=/ )

......可能是一个开始。

免责声明:regexen让我头疼。我现在已经测试了它,它可以反对你的例子。


更新:不,不。 split总是跳过它分割的内容,因此上面的代码会从你的例子中丢失==和!=。 (Monoceres的代码工作正常。)

但是出于某种原因,如果将分裂项括在括号中的正则表达式中,它会将事物保留在答案数组中而不是仅仅分裂它。我不知道这是一个错误,一个功能,还是一些我不太理解的设计。

所以实际上你需要:

s.split( /\s|(==)|(!=)/ )

但这不是解释自己的代码。而且据我所知,它在1.9中不起作用。

答案 3 :(得分:1)

这样的工作:

s = "12&&32 || 90==12 !=67"
a = s.split(/ |(\|\|)|(&&)|(!=)|(==)/)
a.delete("")
p a

由于某种原因,“”仍然在数组中,删除行修复了这个。