ruby regexp - как искать одно слово, но нет, если другое существует (в url / uri).? - PullRequest
1 голос
/ 29 марта 2012

Как я могу сделать регулярное выражение в ruby ​​1.8, которое соответствует:

/my_dir/1/file

, но не при наличии:

/my_dir/1/deeper_stuff/file

Пока у меня есть

 source_string = '/my_dir/1/index.html.erb'

 /^\/my_dir/.match(source_string)

для начального совпадения, как добавить второй дисквалификатор для /deeper_stuff?

, чтобы исключить

 source_string = '/my_dir/1/deeper_stuff/'

.

Ответы [ 3 ]

7 голосов
/ 29 марта 2012

Отрицательный прогноз: /^\/my_dir(?!.*deeper_stuff)/.match(source_string)

1 голос
/ 30 марта 2012

RE = Regexp.new ("^ / my_dir / 1 (/.+)?/ file $")

def is_file (dir)
(m = RE.match (dir)) &&! m [1]? "матч": "нет матча"
конец

ставит is_file ("/ my_file / 1") # => не найдено
ставит is_file ("/ my_dir / 1 / file") # => соответствовать
ставит is_file ("/ my_dir / 1 / deeper_stuff / file") # => нет совпадений
ставит is_file ("/ my_dir / 1 / deeper / stuff / file") # => нет совпадений

1 голос
/ 30 марта 2012

/^/my_dir/\w*/\w+.\S*/.match(source_string) должно работать, если все файлы заканчиваются точкой, а затем некоторым расширением (включая несколько расширений, таких как .html.erb).

Это работает путем поиска /my_dir/, за которым следует любое количество символов слова (буква, цифра, подчеркивание) с последующей косой чертой. Это соответствует следующему каталогу. Затем мы ищем один или несколько символов слова, за которыми следует точка, за которой следует любое количество непробельных символов. Таким образом, /my_dir/deeper_stuff/file.html.erb будет исключено, поскольку дополнительный каталог приводит к тому, что регулярное выражение не совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...