2

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

  • 必须匹配 regex ^(\\\\[^\\]+\\[^\\]+|https?://[^/]+),所以要么是 \server\share (可选地后跟一个或多个“\folder”),要么是 HTTP(S) URL
  • 不能包含任何无效的路径名字符(",<,>, |)

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

4

3 回答 3

0
  • 必须匹配 regex ^(\\\\[^\\]+\\[^\\]+|https?://[^/]+),所以要么是 \\server\share (可选地后跟一个或多个“\folder”),要么是 HTTP(S) URL
  • 不能包含任何无效的路径名字符(",<,>, |)

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

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

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'))
}

于 2017-09-13T09:48:22.887 回答
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

目前,只有“server”被匹配,所以我们需要在前面加上一个反斜杠,这样“\server”就会被匹配。现在,如果你分解一个文件路径,它总是由一个反斜杠 + somefoldername 组成,所以我们需要匹配反斜杠 + somefoldername无限次(但最少一次):

(\\[^\\\s",<>|]+)+

由于这变得有些难以理解,我使用了一个命名的捕获组((?<folder>)):

(?<folder>(\\[^\\\s",<>|]+)+)

这将匹配类似\serveror的所有内容\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...),如果这对您来说可以,请留下它,如果不是,您可能想在 SO 上查看这个问题

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

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

现在可以在组中找到文件夹folderorurlURL,同时仍将部分保存在url或中folder。不幸的是,我对 angular.js 一无所知,但正则表达式会让你开始。此外,请参阅此regex101 演示以获得有效的小提琴。

于 2015-12-09T07:51:02.790 回答
0

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

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

在这里,我们添加了一个否定的前瞻来查看字符串中是否有任何字符,我们将无法匹配。如果我们没有找到,那么正则表达式的其余部分将继续。

如果我正确理解您的要求,您可以这样做:

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

这仍然不会匹配否定前瞻中定义的任何无效字符,并且还符合您匹配一个或多个路径段以及 http(s) 的标准,并且要简单得多。

需要注意的是,如果您需要 2 个或更多路径段,或者 url 上的尾部斜杠,那么这将不起作用。这就是您的正则表达式似乎建议的内容。

所以在那种情况下,这仍然比原来的要干净一些

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

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

于 2015-12-09T08:02:24.437 回答