ruby регулярное выражение должно соответствовать, только если URL-адрес найден в строке один раз - PullRequest
0 голосов
/ 13 февраля 2010

Я пытаюсь добавить условную логику, чтобы определить, есть ли одно регулярное выражение для URL-адреса в строке. Вот пример строки:

string_to_match = "http://www.twitpic.com/23456 ran to catch the bus, http://www.twitpic.com/3456 dodged a bullet at work."

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

if string_to_match =~  /[http\:\/\/]?/
   puts "you're matching more then once. bad man!"
end

Но это не так! Как определить, что в строке есть только одно совпадение?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2010

Ответ от Младена в порядке (считая отдачу от scan), но регулярные выражения уже включают в себя идею сопоставления одной и той же вещи несколько раз или определенное количество раз.В вашем случае вы хотите напечатать предупреждение, если ваш текст встречается 2 или более раз:

/(http:\/\/.+?){2,}/

Используйте .+ или .*, в зависимости от того, хотите ли вы, чтобы URL имел какое-то содержимоеили нет.На самом деле .+? будет соответствовать 1 или более символам без жадности, что вам и нужно.Жадный квантификатор сожрал бы всю строку с первой попытки, а затем ему пришлось бы выполнить несколько обратных действий, прежде чем в конечном итоге найти несколько URL-адресов.

1 голос
/ 13 февраля 2010

Посмотрите на String # scan , вы можете использовать его следующим образом:

if string_to_match.scan(/[http\:\/\/]/).count > 1
   puts "you're matching more then once. bad man!"
end
1 голос
/ 13 февраля 2010

вы можете сделать это так:

if string_to_match =~ /((http:\/\/.*?)http:\/\/)+/

это будет соответствовать, только если у вас есть 2 (или более) вхождения http://

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