Хорошо, первое регулярное выражение, чем объяснение:
(?<folderorurl>(?<folder>(\\[^\\\s",<>|]+)+)|(?<url>https?:\/\/[^\s]+))
Ваше первое условие должно совпадать с именем папки, которые должны не содержать любой символ из «<> |», ни пробела. Это написано как:
[^\s,<>|] # the caret negates the character class, meaning this must not be matched
Кроме того, мы хотим, чтобы соответствовать имени папки, необязательно следует другой (суб) папки, так что мы должны добавить обратную косую черту в классе символов:
[^\\\s,<>|] # added backslash
Теперь мы хотим сопоставить как можно больше символов, но, как минимум, это знак плюса для (+
). Имея это в виду, рассмотрим следующую строку:
\server\folder
На данный момент только «сервер» сопоставляется, поэтому необходимо предварять обратной косой черты, таким образом, «\ сервер» будет соответствовать. Теперь, если вы нарушите FilePath вниз, он всегда состоит из обратной косой + somefoldername, поэтому мы должны соответствовать обратный слэш + somefoldername неограниченное количество раз (но не менее одного):
(\\[^\\\s",<>|]+)+
Поскольку это становится несколько нечитаемым, я использовал именованный захватив группу ((?<folder>)
):
(?<folder>(\\[^\\\s",<>|]+)+)
Это будет соответствовать все как \server
или \server\folder\subfolder\subfolder
и хранить его в группу под названием folder
.
Теперь идет часть URL. URL-адрес состоит из HTTP или HTTPS с последующим двоеточием, два слэша и «что-то потом»:
https?:\/\/[^\s]+ # something afterwards = .+, but no whitespaces
После объяснения выше этого хранится в имени группы под названием «URL»:
(?<folder>(\\[^\\\s",<>|]+)+)
Имейте в виду, что это будет соответствовать даже недействительным строкам URL (например, https://www.google.com.256357216423727...
), если это вам подходит, оставьте его, если нет, вы можете взглянуть на this question here on SO.
Теперь, не в последнюю очередь, давайте объединим два элемента с или, сохраним его в другой названной группе (folderorurl), и мы закончили. Простой, не так ли?
(?<folderorurl>(?<folder>(\\[^\\\s",<>|]+)+)|(?<url>https?:\/\/[^\s]+))
Теперь папка или URL-адрес может быть найден в folderorurl
группы в то же время сохраняя детали в url
или folder
. К сожалению, я ничего не знаю о angular.js, но регулярное выражение запустит вас. Кроме того, см. Это regex101 demo для рабочей скрипки.
Я не думаю, что это будет работать. (? (? (\\ [^ \\\ s ", <> |] +) +) | (? https?: \/\ /.+)) будет неоднократно совпадать с недопустимыми символами. (например, округление скобки() + с квантором + снова начнет совпадение и не будет терпеть неудачу, пока оно не достигнет конца строки. Это означает, что он будет в основном соответствовать чему-либо начиная с косой черты.Кроме того, он не проверяет наличие недопустимых символов в http-фрагменте –
swestner
@swestner: тогда проверьте https://regex101.com/r/gZ9bT4/4. – Jan
regex101 дает мне совпадение на 'https: // aas" dasd ', а также' \ server "\ s', хотя в дальнейшем он только фиксирует до' '' – swestner