ruby - 使用 Ruby 拆分字符串时,/\t+|,/和/[\t+,]/之间有什么区别?

标签 ruby regex split

我有一个由\t,分隔的字符串,但是\t的个数不固定,例如:

a=["seg1\tseg2\t\tseg3,seg4"]

seg2seg3 由两个\t 分隔。

所以我试着把它们分开

a.split(/\t+|,/)

它打印出正确的答案:

["seg1", "seg2", "seg3", "seg4"]

我也试试这个

a.split(/[\t+,]/)

但答案是

["seg1", "seg2", "", "seg3", "seg4"]

为什么 ruby​​ 打印出不同的结果?

最佳答案

因为 [] 里面的 \t+ 并不表示“一个或多个制表符”,而是表示“一个制表符或一个加号”。因为它找到了两个连续的制表符,所以它 split 了两次,中间的字符串变成了空。

大多数特殊字符,如 。 + * ? 等,当放置在一个间隔中时成为“常规”字符。有一些异常(exception),比如 ^(当放在开头时否定间隔),\(转义下一个字符,就像它在外面一样intervals) 和 ] (关闭间隔;另一个 [ 也是不允许的)。所以,[\t+,] 实际上意味着 '\t' 或 '+' 或 ','

不幸的是,我不知道需要或不需要在间隔内转义的完整字符集的任何引用。有疑问,我倾向于逃避只是为了确定。在任何情况下,一个间隔总是只匹配一个字符,如果你想要不同的东西,你必须把你的量词放在外面间隔。 (例如:[\t,]+,如果你也承认连续有两个逗号;否则,你的第一个正则表达式真的是正确的)

关于ruby - 使用 Ruby 拆分字符串时,/\t+|,/和/[\t+,]/之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9866777/

相关文章:

ruby - Array.reject!,它是如何工作的?

python - 当正则表达式匹配做某事时

c# - 查找并插入

c# - 将字符串拆分为最大长度的行而不打断单词的最佳方法

C# 拆分 byte[] 数组

regex - R,第n次出现之前的所有内容的正则表达式

ruby - 从 Ruby 中的对象数组中提取嵌套对象数组的最快方法是什么?>

ruby-on-rails - Gem 的数量如何影响 Rails 应用程序的性能?

ruby-on-rails - 使用 Paperclip 时 ActiveAdmin 不上传图像

regex - 如何正则表达式匹配包含 AWS 安全组 ID 的逗号分隔列表?