【发布时间】:2008-11-24 10:41:02
【问题描述】:
我有一个以空格分隔的文件名列表,其中文件名中的空格以'\'为前缀
例如"第一个\文件第二个\文件"
如何让我的正则表达式匹配每个文件名?
【问题讨论】:
标签: regex
我有一个以空格分隔的文件名列表,其中文件名中的空格以'\'为前缀
例如"第一个\文件第二个\文件"
如何让我的正则表达式匹配每个文件名?
【问题讨论】:
标签: regex
(\\ |[^ ])+
除了空格之外的所有内容,除非它们被转义。应该可以,很抱歉最初误解了您的问题。
【讨论】:
(\\[ ]|[^ ])+ 可能会绕过 IgnorePatternWhiteSpace
(\S|(?<=\\) )+
解释:
您正在多次查找非空白字符 (\S) 或前面有反斜杠的空格。
所有匹配将被保存到马赫组 1,全局应用模式以获取字符串中的所有匹配。
编辑
考虑一下,您甚至不需要捕获到子组。仅匹配就足够了,所以这可能会更有效(?: 切换到非捕获组):
(?:\S|(?<=\\) )+
【讨论】:
我会这样做:
/[^ \\]*(?:\\ [^\\ ]*)*/
这是弗里德尔的“展开循环”习语。相对于其他字符,目标字符串中的转义空格可能很少,因此每次有机会时,您都会尽可能多地吞噬其他字符。这比一次匹配一个字符的交替要有效得多。
编辑:(Tomalak)我在正则表达式周围加上斜线,因为语法高亮器似乎可以识别它们并将整个正则表达式绘制成一种颜色。没有它们,它可能会识别其他字符,如引号,并错误地(且令人困惑地)将正则表达式的部分绘制成不同的颜色。
(Brad) OP 只提到了空格,所以我只允许引用它们,但你是对的。书中最初的展开循环示例用于双引号字符串,它可能包含多个转义序列中的任何一个,其中一个是转义引号。这是正则表达式:
/"[^\\"]*(?:\\.[^\\"]*)*"/
(Tomalak) 当你说它与“字符串开头的文件名”不匹配时,我不明白你的意思。它似乎与 OP 示例中的两个文件名匹配。但是,它也匹配一个空字符串,这是不好的。这可以解决,但除非效率被证明是一个问题,否则不值得付出努力。 Stefan 的解决方案效果很好。
【讨论】:
(?:\\ [^ ]*?)* 可能会更好,例如,如果 'ab\cd' 是有效匹配项。