【问题标题】:Simple C# regex简单的 C# 正则表达式
【发布时间】:2010-12-05 02:08:19
【问题描述】:

我有一个正则表达式,我需要匹配这样的路径:“C:\Documents and Settings\User\My Documents\ScanSnap\382893.pd~”。我需要一个匹配所有路径的正则表达式,除了以“~”或“.dat”结尾的路径。我遇到的问题是我不明白如何匹配和否定确切的字符串 '.dat' 并且仅在路径的末尾。即我不想匹配路径中其他地方的{d,a,t}

我已经构建了正则表达式,但不需要匹配 .dat

[\w\s:\.\\]*[^~]$[^\.dat]

[\w\s:\.\\]* 这匹配所有单词、空格、冒号、句点和退格。 [^~]$[^\.dat]$ 这会导致以 '~' 结尾的匹配失败。看来我应该能够跟进 '.dat' 的否定匹配,但匹配在我的正则表达式测试器中失败。

我认为我的答案在于根据我所阅读的内容进行分组,有人会指出我正确的方向吗?我应该补充一下,我正在使用一个允许正则表达式匹配的文件监视程序,我只有一行来指定正则表达式。

此条目似乎相似:Regex to match multiple strings

【问题讨论】:

    标签: c# regex regex-negation


    【解决方案1】:

    你想使用negative look-ahead

    ^((?!\.dat$)[\w\s:\.\\])*$
    

    顺便说一句,您的角色组 ([\w\s:\.\\]) 不允许在其中使用波浪号 (~)。如果文件名不在末尾,您是否打算允许在文件名中使用波浪号?如果是这样:

    ^((?!~$|\.dat$)[\w\s:\.\\~])*$
    

    【讨论】:

    • 不,我没有意识到,但我不想包含波浪号,我希望排除作为 temp 创建的文件后缀“.pd~”和“.dat”文件。
    • 那么你就完全不用担心波浪号了。由于文件名中根本不会出现波浪号,因此您不必明确检查文件名是否以波浪号结尾。您可以使用第一个更简单的正则表达式。
    • 好的,当您在字符组中包含波浪号时,我明白您现在的意思了。我不希望波浪号出现在我们将使用的任何文件字符串中,尽管我会包含它以防万一。太感谢了!在我了解我正在使用的程序如何工作之前,我尝试了几次,否则我会尽快回复。我是否理解正确,〜或 \.dat 字符串与“$”“结尾匹配”字符匹配?因此,否定前瞻在继续之前检查两者都不存在。如果是这样,我很感激这个参考,它比谷歌教我的要好。
    • 两种建议的解决方案也将拒绝包含字符“~”的文件名,而不仅仅是以它们结尾。这不是 OP 的意图,AFAIK。就我个人而言,我发现我的建议更清晰(也更正确!)。 :)
    • @Bart:人们通常会发现自己的解决方案更清晰。我试图从他正在使用的东西开始并修复它。
    【解决方案2】:

    以下正则表达式:

    ^.*(?<!\.dat|~)$
    

    匹配任何不以'~'或'.dat'结尾的字符串。

    ^             # the start of the string
    .*            # gobble up the entire string (without line terminators!)
    (?<!\.dat|~)  # looking back, there should not be '.dat' or '~'
    $             # the end of the string
    

    简单的英语:匹配一个字符串,只有从字符串的尾部往后看,没有子字符串'.dat'或'~'

    编辑:您的尝试失败的原因是因为否定字符类, [^...] 只会否定单个字符。一个字符类总是匹配一个字符。因此,当您执行 [^.dat] 时,您不会否定字符串“.dat”,而是匹配除 '.'、'd'、'a' 或 't' 之外的单个字符。

    【讨论】:

    • 哦,你是对的。不过,我通过这种方式学到了更多。我可以添加任意数量的扩展以在此否定前瞻分组中忽略吗?
    • 是的,只需 OR 它。正则表达式 ^.*(?&lt;!\.dat|~|\.txt)$ 现在也将拒绝“.txt”文件。
    • 太好了,这就是我要问的。也就是说,通过使用'|' (管道,或)它会工作。谢谢。
    • 嘿,使用消极的后视而不是消极的前瞻很聪明。这样就清楚多了。
    【解决方案3】:
    ^((?!\.dat$)[\w\s:\.\\])*$
    

    这只是对早期答案建议的评论:

    。在字符类 [] 中是文字。并且不需要转义。

    ^((?!\.dat$)[\w\s:.\\])*$
    

    很抱歉将此作为新解决方案发布,但我显然还没有足够的可信度来简单地评论答案。

    【讨论】:

    • 我也没有,不幸的是我也没有足够的可信度给你更多。感谢您明确说明我从其他答案中猜到的内容。
    【解决方案4】:

    我相信您正在寻找这个:

    [\w\s:\.\\]*([^~]|[^\.dat])$
    

    像以前一样查找所有单词字符、空格、句点 (.)、反斜杠。然后匹配字符串末尾的波浪号 (~) 或 '.dat'。如果您知道字符串应该位于新行的开头,您可能还想在开头添加一个插入符号 (^)。

    ^[\w\s:\.\\]*([^~]|[^\.dat])$
    

    【讨论】:

    • 这不是所要求的,[^...] 看起来任何不在列表中的单个字符
    • 谢谢,这就是我的意思,但我错了。这匹配 '.dat' 和 '~' 为正确的。我还不明白为什么。
    最近更新 更多