2016-06-02 2 views
0

Может кто-нибудь объяснить мне, как я хотел бы сделать регулярное выражение что-то вроде этогоC# Регулярное выражение только захватывая первую букву

https://clips.twitch.tv/user/ClipLink 

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

https://clips.twitch.tv/(?<user>[^ ]+?)/(?<url>[^ ]+?) 

Если кто-то может опубликовать выражение, которое будет работать и объяснить, что каждая часть, что было бы удивительно :)

+2

* Я сделал это, и он работает отлично * ... но вы этого не понимаете? это странно. – Rahul

+1

Почему вы ищете пробелы '[^]' вместо несвязанных косых черт '[^ /]'? – juharr

+1

Удалите последнюю '?', Чтобы записать оставшуюся строку. –

ответ

1

Ваша проблема здесь:

https://clips.twitch.tv/(?<user>[^ ]+?)/(?<url>[^ ]+?) 

Является последним ?. Добавленный квантификатор ? делает шаблон ленивым, а не жадным. Когда он жадный, он будет потреблять как можно больше символов и только отдавать назад, когда это необходимо (чтобы соответствовать остальной части рисунка). Когда он ленив, он будет принимать как можно меньше символов, только расширяясь, когда это необходимо. Поскольку + соответствует одному или нескольким, наименьшее, что может соответствовать, равно 1, так это то, что он делает. Исправление проблемы ?.

Вы также можете решить эту проблему, добавив $ в конец. Это соответствует концу строки, чтобы заставить ленивый квантификатор расширяться до тех пор, пока он не достигнет конца строки.

Как заметил кто-то другой, немного странно соответствовать «не пространству», поскольку в вашем URL-адресе нет пробелов. Вы могли бы соответствовать [^/] или вы могли бы просто отказаться, что в целом и просто совпадают с чем-то вроде:

https:\/\/clips.twitch.tv\/(?<user>.+?)\/(?<url>.+)$ 

Или вы могли бы просто использовать Uri класс, который имеет свойства и методы для работы с Ури.

Например:

var uri = new Uri("https://clips.twitch.tv/user/ClipLink"); 
var segments = uri.Segments; 
Console.WriteLine(segments[1)); // user/ 
Console.WriteLine(segments[2]); // ClipLink 
Смежные вопросы