我已经找到了具有这些条件的文件路径的正则表达式,
^(\\\\[^\\]+\\[^\\]+|https?://[^/]+)
匹配,因此可以使用\ server \ share(可选地后跟一个或多个" \ folder" s)或HTTP(S)URL 如何在满足这些条件的angular.js中使用单个正则表达式
答案 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
组中找到或文件夹,同时仍然可以将部分保存在url
或folder
中。不幸的是,我对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。而不是[^/]
使用[^/"<>|]
。
这是一个有点重新排列的正则表达式的工作示例:
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;