2012-01-18 2 views
0

Получил эту строку регулярных выражений из «JavaScript: хорошие детали» (стр. 66). Не могу заставить его работать. Кто-нибудь может понять, что с ним не так?строка для разбора URL-адреса

/^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/ 

он должен разделить строку, как это:

https://stackoverflow.com/questions/ask

на составляющие: схемы, слэш, хост, порт, путь, запрос, хэш

кстати: это регулярное выражение должен быть общим ... он будет использоваться на разных «схемах»

+0

Общий? Схемы? Что вы имеете в виду? –

+0

Вы пытались сделать это, используя класс System.Uri? –

+0

Вы могли бы разместить образец ввода и любые сообщения об ошибках или что на самом деле это результат? –

ответ

4

Возможно, это не ваша цель, но почему бы вам не использовать System.Uri класс?

Он имеет то, что вы хотите, и он анализирует необработанные URI/URL (ы).

http://msdn.microsoft.com/en-us/library/system.uri.aspx

+0

+1: ty. это ответ, который я буду использовать, но я все еще озадачен выражением регулярного выражения. Спасибо, что упомянул этот подход. Поскольку у него есть вопрос с регулярным выражением, нужен ли нам регулярный ответ, или это еще один ответ, разрешенный при использовании SO? – sgtz

+0

SO - это ответ на вопросы. Нет проблем, если вы попросите какое-то решение, но у вас есть другой, который удовлетворит ваши требования. Один замечает ответ как правильный, если он решает проблему, а другие, когда-нибудь, могут ответить, почему ваше регулярное выражение не работает, потому что этот вопрос будет продолжать открываться :) –

1

ваш вопрос помечен c#, так почему бы вам не просто использовать System.Uri класс?

например

string s = "http://stackoverflow.com/questions/ask"; 
Uri uri = new System.Uri(s); 

string scheme = uri.Scheme; 
string host = uri.DnsSafeHost; 
// etc 
+0

+1: ty это ответ, который я буду используя ... но я все еще озадачен выражением регулярного выражения. – sgtz

0

Если это в JavaScript, попробуйте

result = subject.match(/\b(https?|ftp):\/\/([\-A-Z0-9.]+)(\/[\-A-Z0-9+&@#\/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#\/%=~_|!:,.;]*)?/ig); 
+0

Это C# ... Проверить теги OP: D –

+0

также, он не является общим для схемы. Похоже, что он привязан к https/ftp – sgtz

+0

Не видел только C#. Только Javascript и Sgtz правильно ограничивают его https и ftp, но вы можете легко его расширить, чтобы добавить других. – Neo

0

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

/^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:\#(.*))?$/ 
+0

использовал @ "..." для определения строка, поэтому не требуется экранирование. – sgtz

+0

@sgtz Да, это так. Вам нужно избежать символа регулярного выражения, а не C#. Questionmark - метасимвол регулярного выражения - делает предшествующий элемент необязательным. –

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