这个问题(使用正则表达式可能无法轻松解决)是我希望能够从任意字符串中提取Windows文件路径。我能够使用的最接近的(我已经尝试了很多其他方法)正在使用以下正则表达式:
[a-zA-Z]:\\([a-zA-Z0-9() ]*\\)*\w*.*\w*
将选择文件的开头,并设计为查看字符串的模式(在初始驱动器号之后),后跟反斜杠,并以文件名,可选点和可选扩展名结尾。
接下来就是困难了。由于最大路径长度为260个字符,因此我只需要计算起始位置以外的260个字符。但是,由于文件名中允许使用空格(和其他字符),因此我需要确保没有其他反斜杠,这些反斜杠可以表明先前的字符是文件夹的名称,而后面的不是文件名本身
我可以肯定没有完美的隔离感(完美是善良的敌人),但我想知道是否有人可以提出“最佳可能”解决方案?
答案 0 :(得分:0)
这是我根据您所获得的表达式,可以让我在Windows上获取路径:[a-zA-Z]:\\((?:[a-zA-Z0-9() ]*\\)*).*
。此处提供了使用示例:https://regex101.com/r/SXUlVX/1
首先,我将捕获组从([a-zA-Z0-9() ]*\\)*
更改为((?:[a-zA-Z0-9() ]*\\)*)
。
您的原始表达式一个接一个地捕获每个XXX\
(例如:Users\
Users\
)。
我的匹配(?:[a-zA-Z0-9() ]*\\)*
。这使我可以在捕获之前捕获XXX\YYYY\ZZZ\
的串联。这样,它使我可以获得完整的路径。
我所做的第二个更改与文件名有关:我将匹配不包含\
的任何字符组(捕获组是贪婪的)。这使我可以处理奇怪的文件名。
另一个可行的正则表达式为:[a-zA-Z]:\\((?:.*?\\)*).*
,如本例所示:https://regex101.com/r/SXUlVX/2
这次,我使用.*?\\
来匹配路径的XXX\
部分。
.*?
将以非贪婪的方式进行匹配:因此,.*?\\
将匹配文本的最短部分,后跟一个反斜杠。
如果对表达式有任何疑问,请不要犹豫。
我也鼓励您尝试使用https://regex101.com来查看表达式的效果。这也列出了您可以在正则表达式中使用的不同令牌。
编辑:由于我以前的回答没有用(尽管我需要花一些时间来找出确切的原因),所以我正在寻找另一种方法来做您想要的事情。我设法使用字符串拆分和连接来实现。
命令为"\\".join(TARGETSTRING.split("\\")[1:-1])
。
它是如何工作的:将原始字符串分成多个子字符串列表。然后,我删除第一部分和最后一部分([1:-1]
从第二个元素到最后一个元素),然后将结果列表转换回字符串。
无论给出的值是路径还是文件的完整地址,此方法均有效。
Program Files (x86)\\Adobe\\Acrobat Distiller\\acrbd.exe fred
是文件路径
Program Files (x86)\\Adobe\\Acrobat Distiller\\acrbd.exe fred\
是目录路径