简单的C#正则表达式

时间:2009-10-08 17:29:25

标签: c# regex regex-negation

我有一个正则表达式我需要匹配这样的路径:“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

4 个答案:

答案 0 :(得分:5)

您想使用negative look-ahead

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

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

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

答案 1 :(得分:3)

以下正则表达式:

^.*(?<!\.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”之外的单个字符。

答案 2 :(得分:2)

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

这只是对先前回答建议的评论:

。在一个字符类中,[]是一个文字。并且不需要逃避。

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

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

答案 3 :(得分:-2)

我相信你正在寻找这个:

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

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

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