使用.NET中的RegEx规范化Windows路径或URI

时间:2014-06-06 20:41:21

标签: .net regex windows path normalization

我正在尝试构建一个正则表达式,我可以使用匹配本地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://。除了最后一个案例,似乎工作得很好。

1 个答案:

答案 0 :(得分:3)

我对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#的正则表达式。它可能会直接进入,或者可能需要一些按摩(这就是我在代码中留下注释以便于阅读和更多边缘情况的原因)。