正则表达式排除带有 x 个 \ 的行

正则表达式排除带有 x 个 \ 的行

我确信这个问题之前已经有人问过并解决过,但我被困在这个简单的正则表达式上。我使用 powershell 和 .net 来处理正则表达式。

假设我有一个包含以下行的文件:C:\share\my file.txt C:\share\folder1\anotherfile.txt C:\share\folder1\yetanotherfile.txt

什么正则表达式允许我只返回 C:\share\my file.txt 而忽略 C:\share\folder1... 我不知道如何告诉正则表达式忽略包含超过 2 个 \ 的行。

提前致谢。

答案1

我不知道 powershell 的正则表达式的具体细节或者如何逐行扫描文件,但是假设 powershell 正则表达式与所有其他正则表达式一样,那么与你的字符串匹配的实际模式看起来像这样(下面的第三个正则表达式与你的示例匹配):

  • ^[^\\]*(\\[^\\]*){3}$- 恰好 3 个反斜杠,由任意数量(包括零个)非反斜杠分隔。请注意,由于反斜杠在大多数正则表达式实现中都是特殊字符,因此您可能需要将其加倍,即使在 [ ] 内也是如此,因为它也可以在那里使用,以匹配诸如 之类的字符类[\s]
  • ^[^\\]*(\\[^\\]+){,2}$- 介于 0 到 2 个反斜杠之间,不能再多,由 1 个或多个非反斜杠分隔,并在最后一个反斜杠后有其他非反斜杠字符。
  • ^[a-z]:\\share\\[^\\]+$- 我想这就是你想要的。将整个字符串(^ ... $) 匹配到驱动器号,后跟“share”,后跟文件名,但共享名称后不能再有反斜杠。您必须添加/i不区分大小写的匹配,或者 powershell 用于忽略大小写的任何语法,我不知道,但谷歌会展示如何做到这一点。如果您确实知道驱动器并希望修复它,请替换为。替换[a-z]:为以允许任何共享名称,但不能超过顶层。替换为以允许特定共享名称的列表。c:\\share\\[^\\]+(\\[^\\]+){2}share(this-share|that_share)

第二种模式的工作方式如下(第三种模式类似):

  • ^匹配字符串的开头(如果我们不测试整个字符串,它可能会匹配带有 2 个反斜杠的部分,而不会检查其余部分是否没有更多反斜杠)
  • [^\\]*匹配任意数量(0+)的非反斜杠
  • (\\[^\\]+){,2}重复匹配一个组,其中组包含反斜杠,后跟任意数量的非反斜杠,该组最多可重复 2 次(但不能更多)。用于{2}精确匹配 2 次,或{1,2}用于 1 到 2 次(含)匹配
  • $匹配字符串结尾 - 在反斜杠和非反斜杠的重复匹配后不应存在任何其他内容(因为最后一位将是您共享的文件名)

幸运的是,您可以从中解决问题。很难说更多或给出明确的答案,因为有些模式你没有说它应该做什么。例如,有时可能会出现尾随反斜杠,因为这是有效的和可选如果输入恰好是一个文件夹,则可能导致正则表达式对某些文件夹的评估错误。对于 UNC 共享(例如 \\?\D:\share\myfile.txt 或 \\server\share\myfile.txt)也是如此,对于只有一个斜杠的路径(c:\myfile.text)也是如此。对于非法字符也是如此(文件是否包含任何无效文件名,例如分号,或者如果可能发生这种情况,您是否会单独测试?)。

如果您更准确地阐明正则表达式应该做什么,或者您需要解释它们如何工作,我将更新这个答案并添加正则表达式或更多详细信息。

相关内容