gpt4 book ai didi

.net - 在 .NET 中使用 RegEx 规范化 Windows 路径或 URI

转载 作者:可可西里 更新时间:2023-11-01 10:06:02 25 4
gpt4 key购买 nike

我正在尝试构建一个正则表达式,我可以使用它来匹配本地 Windows 路径或 URI 中的所有重复斜杠,然后用单个斜杠替换它们,同时保留URI 方案或本地驱动器部分未更改

这是我正在测试的示例:

http://www.tempuri.org//path//////to/file.ext
c:/path-to/file.ext
c://path-to/file.ext
http://www.tempuri.org
http://www.tempuri.org//
http://www.tempuri.org///
ftp://www.tempuri.org////
file:///c:/path-to//file.ext
file:////c:/path-to/file.ext
file://///c://path-to/file.ext

这就是我想从中得到的:

http://www.tempuri.org/path/to/file.ext
c:/path-to/file.ext
c:/path-to/file.ext
http://www.tempuri.org
http://www.tempuri.org/
http://www.tempuri.org/
ftp://www.tempuri.org/
file:///c:/path-to/file.ext
file:///c:/path-to/file.ext
file:///c:/path-to/file.ext

我得到的最接近的是这个:

(?<!(file:)|(ftp|gopher|http|https|ldap|mailto|net\.pipe|net\.tcp|news|nntp|telnet|uuid)[:])/+

但是用单斜杠替换匹配项会将file:/// 变成file://。除了最后一个案例,似乎工作得很好。

最佳答案

我比较熟悉 PCRE 格式,但是看看这个:

(                     # Capture group

(?<!\/)\/ # Look for / that does not follow another /

# Look for C:/
(?(?<=\b[a-zA-Z]:\/) # if...
# then look for any more / to remove
| # else

# Look for file:///
(?(?<=\bfile:\/) # if...
\/\/ # then look for // right after it
| # else

# Look for http:// or ftp://, etc.
(?(?<=:\/) # if [stuff]:/
\/ # then look for /
| # else

)
)
)
)
\/+ # everything else with / after it

直播:http://regex101.com/r/hU4yI4

基本上,我正在使用 conditional statement 寻找这些条件:

If / is preceded by:
\b[a-zA-Z]: then /
\bfile: then ///
\b\w{2,}: then / (basically anything else, like ftp:, https:, etc.)

如果没有所有的空格,整个组看起来更像:

((?<!\/)\/(?(?<=\b[a-zA-Z]:\/)|(?(?<=\bfile:\/)\/\/|(?(?<=:\/)\/|))))\/+

不过,我不确定这将如何插入到 C# 的正则表达式中。它可能会直接插入,或者可能需要一些修改(这就是为什么我在代码中留下注释以便于阅读和更多边缘情况)。

关于.net - 在 .NET 中使用 RegEx 规范化 Windows 路径或 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24090278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com