用于文件路径的ng-pattern的正则表达式

时间:2015-12-09 06:39:18

标签: javascript angularjs regex regex-negation angularjs-ng-pattern

我已经找到了具有这些条件的文件路径的正则表达式,

  • 必须与正则表达式^(\\\\[^\\]+\\[^\\]+|https?://[^/]+)匹配,因此可以使用\ server \ share(可选地后跟一个或多个" \ folder" s)或HTTP(S)URL
  • 不能包含任何无效的路径名称字符(",<,>,|)

如何在满足这些条件的angular.js中使用单个正则表达式

3 个答案:

答案 0 :(得分:0)

好的,首先是正则表达式,而不是解释:

(?<folderorurl>(?<folder>(\\[^\\\s",<>|]+)+)|(?<url>https?:\/\/[^\s]+))

您的第一个条件是匹配文件夹名称,该名称必须包含“,&lt;&gt; |”中的任何字符也不是空白。这写成:

[^\s,<>|] # the caret negates the character class, meaning this must not be matched

此外,我们希望匹配文件夹名称,可选地后跟另一个名称 (子)文件夹,所以我们必须在字符类中添加反斜杠:

[^\\\s,<>|] # added backslash

现在我们希望匹配尽可能多的字符,但至少只有一个,这就是加号(+)的含义。考虑到这一点,请考虑以下字符串:

\server\folder

目前,只有“服务器”匹配,所以我们需要添加一个反斜杠,因此“\ server”将匹配。现在,如果你打破文件路径,它总是由反斜杠+ 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...),如果这对您没问题,请保留,如果没有,您可能需要查看{{ 3}}

现在,最后但并非最不重要的是,让我们将这两个元素与结合起来,将其存储在另一个命名组(folderorurl)中,我们就完成了。简单,对吧?

(?<folderorurl>(?<folder>(\\[^\\\s",<>|]+)+)|(?<url>https?:\/\/[^\s]+))

现在可以在folderorurl组中找到文件夹,同时仍然可以将部分保存在urlfolder中。不幸的是,我对angular.js一无所知,但正则表达式会让你开始。另外,请参阅此this question here on SO了解工作小提琴。

答案 1 :(得分:0)

您当前的正则表达式似乎与您想要的不匹配。但鉴于它正确地做你想要的,那么这将增加否定:

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

在这里,我们添加了一个负向前瞻,以查看字符串中是否有任何字符,我们将使匹配失败。如果我们找不到,那么正则表达式的其余部分将继续。

如果我理解你的要求,你可能会这样做:

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

这仍然不会匹配负前瞻中定义的任何无效字符,并且还符合匹配一个或多个路径段以及http(s)的条件,并且更加简单。

如果你需要2个或更多的路径段,或者url上有一个尾部斜线,那么这个空心就是这个。这正是你的正则表达式所暗示的。

所以在这种情况下,这仍然比原来的更清洁

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

还有一点。您要求匹配\server\share,但您的正则表达式会以\\\\打开。我假设\server\share应该是\\server\share并相应地编写了正则表达式。如果不是这种情况,那么我给出的示例中\\\\的所有实例都应更改为\\

答案 2 :(得分:0)

  
      
  • 必须与正则表达式^(\\\\[^\\]+\\[^\\]+|https?://[^/]+)匹配,因此要么类似\\ server \ share(可选地后跟一个或多个)   &#34; \ folder&#34; s),或HTTP(S)URL
  •   
  • 不能包含任何无效的路径名称字符(&#34;,&lt;,&gt;,|)
  •   

要在正则表达式中引入第二个条件,您主要只需要在否定字符集中包含无效字符,例如: G。而不是[^/]使用[^/"<>|]

这是一个有点重新排列的正则表达式的工作示例:

&#13;
&#13;
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'))
}
&#13;
&#13;
&#13;