我正在试图找出最好的方法......
给定一个字符串
s = "if someBool || x==1 && y!=22314"
我想使用Ruby分隔语句和布尔运算符..所以我想把它分成
["if","someBool","||","x","==","1","&&","y","!=","22314"]
我可以使用s.split(),但这只会将空格作为分界符分割。但我也希望x!= y被拆分(它们是有效的布尔句子,它们之间没有空格良好的可读性)。当然最简单的方法是要求用户在布尔运算符和变量之间放置空格,但有没有其他方法可以做到这一点?
答案 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
由于某种原因,“”仍然在数组中,删除行修复了这个。