我有一个以空格分隔的文件名列表,其中文件名中的空格以'\'为前缀
e.g。 “first \ file second \ file”
如何让我的正则表达式匹配每个文件名?
答案 0 :(得分:14)
(\\ |[^ ])+
除了空格之外的所有内容,除非它们被转义。应该工作,抱歉最初误解了你的问题。
答案 1 :(得分:5)
(\S|(?<=\\) )+
说明:
您正在寻找非空白字符(\S
)或前面带有反斜杠的空格,多次。
所有匹配项将保存到mach组1,全局应用模式以获取字符串中的所有匹配项。
修改
考虑一下,你甚至不需要捕捉到一个小组。仅仅匹配就足够了,所以这可能会更高效(?:
切换到非捕获组):
(?:\S|(?<=\\) )+
答案 2 :(得分:1)
我会这样做:
/[^ \\]*(?:\\ [^\\ ]*)*/
这是Friedl的“展开循环”成语。目标字符串中可能只有很少的转义空格相对于其他字符,因此每次有机会时,您可以尽可能多地吞噬其他字符。这比一次匹配一个字符的交替更有效。
编辑:( Tomalak)我在正则表达式周围添加了斜杠,因为语法高亮显示器似乎识别它们并用一种颜色绘制整个正则表达式。没有它们,它可以拾取其他字符,如引号,并且错误地(并且容易混淆地)以不同颜色绘制正则表达式的部分。
(布拉德)OP只提到空格,所以我只允许引用它们,但你是对的。本书中原始的展开循环示例是针对双引号字符串的,它可能包含几个转义序列中的任何一个,其中一个是转义引号。这是正则表达式:
/"[^\\"]*(?:\\.[^\\"]*)*"/
(Tomalak)当你说它与字符串开头的文件名不匹配时,我不知道你的意思。它似乎匹配OP示例中的两个文件名。但是,它也匹配一个空字符串,这是不好的。这可以修复,但除非效率被证明是一个问题,否则不值得努力。 Stefan的解决方案运行良好。