ruby regex разделяет трудности, близко, но не совсем - PullRequest
3 голосов
/ 23 октября 2010

У меня довольно большие трудности с использованием регулярных выражений в ruby ​​для разбиения строки по нескольким разделителям:

  • /
  • &
  • и

каждый из этих разделителей может иметь любое количество пробелов по обе стороны от разделителя, но каждый элемент может содержать допустимое пространство. отличный пример, который я проверял, это строка 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 голосов
/ 23 октября 2010
/\s*,|\/|&|and \s*/

Это разбирается как /(\s*,)|\/|&|(and \s*)/.Т.е. начальный \s* относится только к запятой, а завершающий \s* относится только к «и».Вы хотите:

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

Или, чтобы избежать захвата:

/\s*(?:,|\/|&|and )\s*/
1 голос
/ 23 октября 2010

Вы можете попробовать:

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

Но, как предположил Накилон, вам может повезти с сканированием, а не с разделением.

1 голос
/ 23 октября 2010

Попробуйте .scan:

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