В чем разница между / \ t + |, / и / [\ t +,] / при разбиении строки с использованием Ruby? - PullRequest
1 голос
/ 26 марта 2012

У меня есть строка, разделенная \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 ​​печатает разные результаты?

1 Ответ

5 голосов
/ 26 марта 2012

Поскольку \t+ внутри [] не означает «одна или несколько вкладок», это означает «вкладка или плюс».Поскольку он находит две последовательные вкладки, он разделяется дважды, и строка в середине становится пустой.

Большинство специальных символов, таких как . + * ? и т. Д., При размещении в интервале становятся «обычными» символами.Есть некоторые исключения, такие как ^ (который отменяет интервал при помещении в начало), \ (который экранирует следующий символ (ы), так же, как это происходит вне интервалов) и ] (который закрываетсяинтервал; другой [ также запрещен там).Итак, [\t+,] на самом деле означает '\t' or '+' or ','.

К сожалению, я не знаю ссылок на полный набор символов, которые нуждаются или не нуждаются в экранировании внутри интервала.В сомнениях я стараюсь убежать, просто чтобы быть уверенным.В любом случае интервал всегда будет соответствовать только одному символу. Если вы хотите что-то другое, вы должны поместить свой квантификатор за пределы интервала.(Например: [\t,]+, если вы также допускаете две запятые подряд; в противном случае ваше первое регулярное выражение действительно правильное)

...