Ruby正则表达式分割困难,接近但不完全

3
我在使用Ruby中的正则表达式在多个分隔符上拆分字符串时遇到了困难,这些分隔符是:
- , - / - & - and
每个分隔符两侧都可以有任意数量的空格,但每个项都可能包含一个有效的空格。我一直在测试的一个很好的例子是字符串1, 2 /3 and 4 12 我想要的是类似于"1, 2 /3 and 4 12".split(regex) =>["1", "2", "3", "4 12"]的结果。
我最接近的是/\s*,|\/|&|and \s*/,但这会生成["1", " 2 ", "3 ", "4 12"]而不是所需的结果。
请注意,这已经非常接近了,我只需要在每个项上修剪即可,但如此接近并且知道它可以完成使我有点发疯。希望有人能帮我保持清醒。
3个回答

3
/\s*,|\/|&|and \s*/

这个解析为/(\s*,)|\/|&|(and \s*)/。也就是说,前导的\s*只适用于逗号,而尾随的\s*仅适用于“and”。您需要的是:

/\s*(,|\/|&|and )\s*/

或者,为避免捕获:

/\s*(?:,|\/|&|and )\s*/

我知道我快成功了!我不熟悉 ?:,我想这就是问题所在。没有 ?: 似乎不能返回正确的结果。谢谢,现在我需要去查一下 ?: 是什么意思。 - Apeiron
@Apeiron:?: 只是使组成为非捕获型。在这种情况下,这意味着括号匹配的部分不会出现在 split 的结果中。 - sepp2k

1
尝试使用.scan:
irb(main):030:0> "1, 2 /3 and 4 12".scan(/\d+(?:\s*\d+)*/)
=> ["1", "2", "3", "4 12"]

1

你可以尝试:

(?:\s*)[,\/](?:\s*)|(?:\s*)and(?:\s*)

但是正如Nakilon所建议的那样,您使用scan而不是split可能会更加顺利。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接