2015-08-05 3 views
2

В предыдущей post я просил о помощи на переписывание регулярного выражения без отрицанияНаписать регулярное выражение без отрицаний

Начиная регулярное выражение:

https?:\/\/(?:.(?!https?:\/\/))+$ 

Законченных с:

https?:[^:]*$ 

Этом отлично работает, но я заметил, что в случае, если у меня будет : в моем URL, кроме : из http \ s, он не будет выбран.

Вот строка, которая не работает:

sometextsometexhttp://websites.com/path/subpath/#query1sometexthttp://websites.com/path/subpath/:query2 

Вы можете заметить :query2

Как я могу изменить второе регулярное выражение, перечисленные здесь, так что она будет выбирать URLs, которые содержат :.

Ожидаемый результат:

http://websites.com/path/subpath/cc:query2 

Кроме того, я хотел бы, чтобы выбрать все до первого из ?=param вхождение

Вход: sometextsometexhttp://websites.com/path/subpath/#query1sometexthttp://websites.com/path/subpath/cc:query2/text/?=param

Выход:

http://websites.com/path/subpath/cc:query2/text/

ответ

4

Жаль, что Re regex не поддерживает поисковые запросы. Однако, вы можете получить последнюю связь с каким-то подвохом: сопрягать все возможные ссылки и другие символы с жадностью и захватить последнюю связь с захватом группой:

^(?:https?://|.)*(https?://\S+?)(?:\?=|$) 

вместе с \S*? ленивым соответствием пробельного, это также позволяет захватить связь до ?=.

См regex demo и Go demo

var r = regexp.MustCompile(`^(?:https?://|.)*(https?://\S+?)(?:\?=|$)`) 
fmt.Printf("%q\n", r.FindAllStringSubmatch("sometextsometexhttp://websites.com/path/subpath/#query1sometexthttp://websites.com/path/subpath/:query2", -1)[0][1]) 
fmt.Printf("%q\n", r.FindAllStringSubmatch("sometextsometexhttp://websites.com/path/subpath/#query1sometexthttp://websites.com/path/subpath/cc:query2/text/?=param", -1)[0][1]) 

Результаты:

"http://websites.com/path/subpath/:query2" 
"http://websites.com/path/subpath/cc:query2/text/" 

В случае могут быть пробелы в последней ссылке, используйте только .+?:

^(?:https?://|.)*(https?://.+?)(?:\?=|$) 
+2

Чувак! Вы просто! –

+1

Если совпадение совпадений не требуется и нет поддержки поиска, всегда есть способ получить требуемую подстроку с функцией регулярного выражения захвата. –

Смежные вопросы