代码之家  ›  专栏  ›  技术社区  ›  David Sykes

用于匹配非空白或前缀为\“的空格的regex

  •  3
  • David Sykes  · 技术社区  · 16 年前

    我有一个以空格分隔的文件名列表,其中文件名中的空格前面加上'\'

    例如,“first\file second\file”

    如何让我的regex匹配每个文件名?

    3 回复  |  直到 16 年前
        1
  •  14
  •   Stefan Mai    16 年前
    (\\ |[^ ])+
    

    除了空格以外的所有东西,除非它们被逃走了。应该有效,很抱歉最初误解了你的问题。

        2
  •  5
  •   Tomalak    16 年前
    (\S|(?<=\\) )+
    

    说明:

    您正在查找非空白字符( \S )或者前面有反斜杠的空格,多次。

    所有匹配将保存到马赫组1,全局应用该模式以获取字符串中的所有匹配。

    编辑

    考虑到这一点,您甚至不需要捕获到子组。仅匹配就足够了,所以这可能会稍微提高一点效率。 ?: 切换到非捕获组):

    (?:\S|(?<=\\) )+
    
        3
  •  1
  •   Alan Moore Chris Ballance    16 年前

    我会这样做:

    /[^ \\]*(?:\\ [^\\ ]*)*/
    

    这是弗里德的“展开循环”习语。相对于其他字符,目标字符串中的转义空格可能非常少,因此每次有机会时,您都会尽可能多地吞食其他字符。这比一次匹配一个字符的交替更有效。

    edit:(tomalak)我在regex周围加上斜线,因为语法高亮显示程序似乎可以识别它们并将整个regex漆成一种颜色。如果没有这些符号,它可能会记住其他字符,如引号,并错误地(令人困惑地)将regex的部分漆成不同的颜色。

    (布拉德)这首歌只提到了空格,所以我只允许引用它们,但你是对的。书中最初展开的循环示例是双引号字符串,它可以包含几个转义序列中的任何一个,其中一个是转义引号。这是Regex:

    /"[^\\"]*(?:\\.[^\\"]*)*"/
    

    (tomalak)我不知道当你说它与“字符串开头的文件名”不匹配时你的意思是什么。它似乎与op例子中的两个文件名都匹配。但是,它也匹配一个空字符串,这是不好的。这是可以解决的,但除非效率被证明是一个问题,否则它不值得付出努力。Stefan的解决方案很好。