【问题标题】:regex to match non-whitespace OR space prefixed with '\\'正则表达式匹配以 '\\' 为前缀的非空白或空格
【发布时间】:2008-11-24 10:41:02
【问题描述】:

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

例如"第一个\文件第二个\文件"

如何让我的正则表达式匹配每个文件名?

【问题讨论】:

    标签: regex


    【解决方案1】:
    (\\ |[^ ])+
    

    除了空格之外的所有内容,除非它们被转义。应该可以,很抱歉最初误解了您的问题。

    【讨论】:

    • 这将匹配一个空行以及一个[TAB]b。
    • +1 以获得更简单且兼容的解决方案。并非所有正则表达式风格都向后看。
    • 如果您正在使用此正则表达式和 .Net,请确保不要打开 IgnorePatternWhiteSpace。
    • (\\[ ]|[^ ])+ 可能会绕过 IgnorePatternWhiteSpace
    【解决方案2】:
    (\S|(?<=\\) )+
    

    解释:

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

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

    编辑

    考虑一下,您甚至不需要捕获到子组。仅匹配就足够了,所以这可能会更有效(?: 切换到非捕获组):

    (?:\S|(?<=\\) )+
    

    【讨论】:

    • 我最初选择你的答案是因为关于 Stefan 匹配 aTABb 的评论,但你的答案也是如此。两个答案都很好,解决了我的问题,但公平地说,斯塔凡的答案更早
    • 我更改了模式,使其不再匹配 TAB 或其他空格。
    【解决方案3】:

    我会这样做:

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

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

    编辑:(Tomalak)我在正则表达式周围加上斜线,因为语法高亮器似乎可以识别它们并将整个正则表达式绘制成一种颜色。没有它们,它可能会识别其他字符,如引号,并错误地(且令人困惑地)将正则表达式的部分绘制成不同的颜色。

    (Brad) OP 只提到了空格,所以我只允许引用它们,但你是对的。书中最初的展开循环示例用于双引号字符串,它可能包含多个转义序列中的任何一个,其中一个是转义引号。这是正则表达式:

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

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

    【讨论】:

    • 实际上,在 Java 中,我会使用所有格量词和/或原子组来编写更直接的正则表达式。但展开的循环适用于任何语言。
    • 这与字符串开头的文件名不匹配。
    • (?:\\ [^ ]*?)* 可能会更好,例如,如果 'ab\cd' 是有效匹配项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2020-05-19
    相关资源
    最近更新 更多