2

Я прибыл в регулярном выражении для пути к файлу, который имеет эти условия,регулярного выражения для нг-шаблона для FilePath

  • должен соответствовать регулярному выражению ^(\\\\[^\\]+\\[^\\]+|https?://[^/]+), так как что-то вроде \ сервер \ доли (в случае необходимости следует один или более "\ папка" s), или HTTP (S) URL
  • не может содержать недопустимое имя путь символов (», <,>, |)

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

ответ

0

Хорошо, первое регулярное выражение, чем объяснение:

(?<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 для рабочей скрипки.

+0

Я не думаю, что это будет работать. (? (? (\\ [^ \\\ s ", <> |] +) +) | (? https?: \/\ /.+)) будет неоднократно совпадать с недопустимыми символами. (например, округление скобки() + с квантором + снова начнет совпадение и не будет терпеть неудачу, пока оно не достигнет конца строки. Это означает, что он будет в основном соответствовать чему-либо начиная с косой черты.Кроме того, он не проверяет наличие недопустимых символов в http-фрагменте – swestner

+0

@swestner: тогда проверьте https://regex101.com/r/gZ9bT4/4. – Jan

+1

regex101 дает мне совпадение на 'https: // aas" dasd ', а также' \ server "\ s', хотя в дальнейшем он только фиксирует до' '' – swestner

0

Ваше текущее регулярное выражение не похоже на то, что вы хотите. Но учитывая, что правильно делать то, что вы хотите, то это добавит отрицание:

^(?!.*[ "<>|])(\\\\[^\\]+\\[^\\]+|https?://[^/]+) 

Здесь мы добавили отрицательный предпросмотр, чтобы увидеть, если какие-либо символы в строке, которые мы подведем матч. Если мы не найдем его, остальное регулярное выражение будет продолжено.

Если я правильно понимаю ваши требования правильно, то вы, вероятно, может сделать это:

^(?!.*[ "<>|])(\\\\|https?://).*$ 

Это до сих пор не найдено ни одного недопустимые символы, определенные в отрицательного предпросмотра, а также соответствует вашим критериям соответствия одного или нескольких сегментов контура , а также http (s) и намного проще.

Кавитация заключается в том, что если вам требуется два или более сегмента пути или конечная косая черта на URL-адресе, это не сработает. Это то, что предлагает ваше регулярное выражение.

Так что в этом случае это еще несколько чище, чем оригинальный

^(?!.*[ "<>|])(\\\\[^\\]+\\.|https?://[^/]+/).*$ 

One более точка. Вы просите сопоставить \server\share, но ваше регулярное выражение открывается \\\\. Я предположил, что \server\share должен быть \\server\share и соответственно написал регулярное выражение. Если это не так, то все экземпляры \\\\ в примерах, которые я дал должны быть изменены на \\

0
  • должен соответствовать регулярному выражению ^(\\\\[^\\]+\\[^\\]+|https?://[^/]+), так как что-то вроде \\ сервер \ доли (в случае необходимости следует один или более "\ папка" s), или HTTP (S) URL
  • не может содержать недопустимое имя путь символов (», <,>, |)

Чтобы ввести второй отелю об n в вашем регулярном выражении, вы в основном просто должны включать недопустимые символы в отрицательных наборах символов, например. г. вместо [^/] использование [^/"<>|].

Вот рабочий пример с немного переставить регулярное выражение:

paths = [ '\\server\\share', 
 
      '\\\\server\\share', 
 
      '\\\\server\\share\\folder', 
 
      'http://www.invalid.de', 
 
      'https://example.com', 
 
      '\\\\<server\\share', 
 
      'https://"host.com', 
 
      '\\\\server"\\share', 
 
     ] 
 
for (i in paths) 
 
{ 
 
    document.body.appendChild(document.createTextNode(paths[i]+' '+ 
 
    /^\\(\\[^\\"<>|]+){2,}$|^https?:\/\/[^/"<>|]+$/.test(paths[i]))) 
 
    document.body.appendChild(document.createElement('br')) 
 
}

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