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

使用Ruby拆分字符串时,/\t+|,/和/[\t+,]/之间有什么区别?,ruby,regex,split,Ruby,Regex,Split,我有一个由\t和、、分隔的字符串,但\t的数目不是固定的,例如: a=["seg1\tseg2\t\tseg3,seg4"] seg2和seg3由两个\t分隔 所以我试着把他们分开 a.split(/\t+|,/) 它会打印右箭头: ["seg1", "seg2", "seg3", "seg4"] 我也试过这个 a.split(/[\t+,]/) 但答案是 ["seg1", "seg2", "", "seg3", "seg4"] 为什么ruby打印不同的结果?因为“[]内的\t+并不意

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

a=["seg1\tseg2\t\tseg3,seg4"]
seg2和seg3由两个\t分隔

所以我试着把他们分开

a.split(/\t+|,/)
它会打印右箭头:

["seg1", "seg2", "seg3", "seg4"]
我也试过这个

a.split(/[\t+,]/)
但答案是

["seg1", "seg2", "", "seg3", "seg4"]
为什么ruby打印不同的结果?

因为“[]内的\t+并不意味着一个或多个选项卡,它意味着一个选项卡或一个加号。因为它找到两个连续的选项卡,它分裂两次,中间的字符串变为空。

大多数特殊字符,如.+*?等,当放置在一个间隔中时,将成为常规字符。也有一些例外情况,如^在开始时否定间隔,转义下一个字符的\和间隔外的\一样,以及关闭间隔的“];另一个[在这里也是不允许的。因此,[\t+,]实际上意味着“\t”或“+”或“,”

不幸的是,对于需要或不需要在间隔内转义的完整字符集,我不知道有任何引用。毫无疑问,我倾向于转义只是为了确定。在任何情况下,间隔将始终只匹配单个字符,如果您想要不同的内容,则必须将量词放在间隔外。例如:[\t,]+,如果你还承认两个逗号在一行;否则,你的第一个正则表达式确实是正确的百万富翁[/p>< p>,因为\t+[n]不意味着一个或多个标签,它意味着一个标签或一个加号。因为它找到两个连续的标签,它分裂两次,中间的字符串变空。 大多数特殊字符,如.+*?等,当放置在间隔中时会变成常规字符。也有一些例外情况,如^在开始放置时会否定间隔,转义下一个字符的\与间隔外的字符一样,以及关闭间隔的“];另一个[在这里也是不允许的。因此,[\t+,]实际上意味着“\t”或“+”或“,”


不幸的是,对于需要或不需要在间隔内转义的完整字符集,我不知道有任何引用。毫无疑问,我倾向于转义只是为了确定。在任何情况下,间隔将始终只匹配单个字符,如果您想要不同的内容,则必须将量词放在间隔外。例如:[\t,]+,如果您同时承认一行中有两个逗号;否则,您的第一个正则表达式实际上是正确的

需要在[]中转义的全套字符就是您提到的:[]\^加号-取决于位置True。值得注意的是-不是间隔外的特殊字符,仅在间隔内和其他两个字符之间。除此之外,^也可以是特殊字符或不特殊字符,取决于第一个字符的位置,它否定间隔;在其他任何地方它都是常规字符。最奇怪的是:]由于允许使用第一个字符-[]x]与x或a]匹配。这是因为我总是在怀疑的时候逃逸很多角落的情况……事实上]正如第一个字符会给出警告一样,它预计会在ruby正则表达式中逃逸,尽管许多其他正则表达式引擎都允许它。需要在[]中逃逸的全套字符就是您提到的:[]\^plus-取决于位置True。有趣的是,在间隔之外,它不是一个特殊的字符,只是在间隔内部,以及在其他两个字符之间。除此之外,^还可以是特殊的或不特殊的,这取决于第一个字符的位置,它否定了间隔;在其他地方,它是一个普通字符。最奇怪的是:]第一个字符是允许的-[]x]与x或a]匹配。这是因为我总是在怀疑的时候逃逸很多角落的案例……事实上]由于第一个字符会给出警告,它预计会在ruby regex中逃逸,尽管许多其他regex引擎都允许它。