Захватить произвольную строку перед '/' или концом строки - PullRequest
1 голос
/ 21 января 2011

Предположим, у меня есть:

foo/fhqwhgads
foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar

И я хочу заменить все, что следует за 'foo /', до тех пор, пока я не достигну '/' или, если '/' никогда не достигнуто, то до конца строки. Для первой части я могу использовать группу без захвата, например:

(?<=foo\/).+

И вот где я застреваю. Я мог бы соответствовать второму «/», как это:

(?<=foo\/).+(?=\/)

Это не поможет в первом случае. Желаемый результат:

foo/blah
foo/blah/bar

Я использую Ruby.

Ответы [ 5 ]

3 голосов
/ 21 января 2011

Попробуйте это регулярное выражение:

/(?<=foo\/)[^\/]+/
1 голос
/ 21 января 2011

Реализация @ ответа Эндофага:

def fix_post_foo_portion(string)
  portions = string.split("/")
  index_to_replace = portions.index("foo") + 1
  portions[index_to_replace ] = "blah"
  portions.join("/")
end

strings = %w{foo/fhqwhgads foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar}
strings.each {|string| puts fix_post_foo_portion(string)}
0 голосов
/ 21 января 2011
['foo/fhqwhgads', 'foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar'].each do |s|
  puts s.sub(%r|^(foo/)[^/]+(/.*)?|, '\1blah\2')
end

Вывод:

foo/blah
foo/blah/bar

Я слишком устал, чтобы думать о более хорошем способе сделать это, но я уверен, что есть один.

0 голосов
/ 21 января 2011

Проверка привязки конца строки - $ -, а также символа / должны помочь.Вам также нужно будет сделать .+ не жадным, изменив его на .+?, так как жадная версия всегда будет соответствовать вплоть до конца строки, если есть шанс.

(?<=foo\/).+?(?=\/|$)
0 голосов
/ 21 января 2011

Я не разработчик ruby, но есть ли какой-то эквивалент в php explode (), чтобы вы могли взорвать строку, вставить новый элемент в индекс второго массива, а затем взорвать части с помощью / снова ... Конечно, вы можете совпадать с первым элементом массива, если вы хотите выполнить переключение только в определенных случаях.

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