我已经到达了具有这些条件的文件路径的正则表达式,
- 必须匹配 regex
^(\\\\[^\\]+\\[^\\]+|https?://[^/]+)
,所以要么是 \server\share (可选地后跟一个或多个“\folder”),要么是 HTTP(S) URL - 不能包含任何无效的路径名字符(",<,>, |)
如何在满足这些条件的 angular.js 中使用单个正则表达式
我已经到达了具有这些条件的文件路径的正则表达式,
^(\\\\[^\\]+\\[^\\]+|https?://[^/]+)
,所以要么是 \server\share (可选地后跟一个或多个“\folder”),要么是 HTTP(S) URL如何在满足这些条件的 angular.js 中使用单个正则表达式
- 必须匹配 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'))
}
好的,首先是正则表达式,而不是解释:
(?<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",<>|]+)+)
这将匹配类似\server
or的所有内容\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]+))
现在可以在组中找到文件夹或folderorurl
URL,同时仍将部分保存在url
或中folder
。不幸的是,我对 angular.js 一无所知,但正则表达式会让你开始。此外,请参阅此regex101 演示以获得有效的小提琴。
您当前的正则表达式似乎与您想要的不匹配。但鉴于它正确地做你想做的事,那么这将添加否定:
^(?!.*[ "<>|])(\\\\[^\\]+\\[^\\]+|https?://[^/]+)
在这里,我们添加了一个否定的前瞻来查看字符串中是否有任何字符,我们将无法匹配。如果我们没有找到,那么正则表达式的其余部分将继续。
如果我正确理解您的要求,您可以这样做:
^(?!.*[ "<>|])(\\\\|https?://).*$
这仍然不会匹配否定前瞻中定义的任何无效字符,并且还符合您匹配一个或多个路径段以及 http(s) 的标准,并且要简单得多。
需要注意的是,如果您需要 2 个或更多路径段,或者 url 上的尾部斜杠,那么这将不起作用。这就是您的正则表达式似乎建议的内容。
所以在那种情况下,这仍然比原来的要干净一些
^(?!.*[ "<>|])(\\\\[^\\]+\\.|https?://[^/]+/).*$
还有一点。您要求匹配\server\share
,但您的正则表达式以\\\\
. 我假设\server\share
应该是\\server\share
并相应地编写了正则表达式。如果不是这种情况,那么\\\\
我给出的示例中的所有实例都应更改为\\