简单C#正则表达式

简单C#正则表达式,c#,regex,regex-negation,C#,Regex,Regex Negation,我有一个正则表达式需要与如下路径匹配:“C:\Documents and Settings\User\My Documents\ScanSnap\382893.pd~”。我需要一个正则表达式,它匹配除以“~”或“.dat”结尾的路径以外的所有路径。我遇到的问题是,我不知道如何匹配和否定确切的字符串“.dat”,并且只在路径的末尾。i、 e.我不想在路径的其他地方匹配{d,a,t} 我已经建立了正则表达式,但不需要匹配。dat [\w\s:\.\]*[^~]$[^\.dat] [\w\s:\.\]

我有一个正则表达式需要与如下路径匹配:“
C:\Documents and Settings\User\My Documents\ScanSnap\382893.pd~
”。我需要一个正则表达式,它匹配除以“~”或“
.dat
”结尾的路径以外的所有路径。我遇到的问题是,我不知道如何匹配和否定确切的字符串“
.dat
”,并且只在路径的末尾。i、 e.我不想在路径的其他地方匹配
{d,a,t}

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

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

[\w\s:\.\]*
这匹配所有单词、空格、冒号、句点和空格。
[^~]$[^\.dat]$
这会导致以“~”结尾的匹配失败。似乎我应该能够继续使用“.dat”的否定匹配,但在我的正则表达式测试程序中匹配失败

我想我的答案在于分组。根据我所读到的,有人能给我指出正确的方向吗?我应该补充一点,我正在使用一个允许正则表达式匹配的文件监视程序,我只有一行来指定正则表达式

此条目似乎类似:

您想使用:

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

^((?!~$|\.dat$)[\w\s:\.\\~])*$
您想使用一个:

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

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

我相信你正在寻找这个:

[\w\s:\.\\]*([^~]|[^\.dat])$
它会像以前一样找到所有的字符、空格、句点(.)、反斜杠。然后匹配字符串末尾的波浪号(~)或“.dat”。如果您知道字符串应该位于新行的开头,那么您可能还希望在开头添加插入符号(^)

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

我相信你正在寻找这个:

[\w\s:\.\\]*([^~]|[^\.dat])$
它会像以前一样找到所有的字符、空格、句点(.)、反斜杠。然后匹配字符串末尾的波浪号(~)或“.dat”。如果您知道字符串应该位于新行的开头,那么您可能还希望在开头添加插入符号(^)

^[\w\s:\.\\]*([^~]|[^\.dat])$
以下正则表达式:

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

以下正则表达式:

^.*(?<!\.dat|~)$
^((?!\.dat$)[\w\s:\.\\])*$
^.*?
匹配任何不以“~”或“.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”或“~”

Edit:尝试失败的原因是,被求反的字符类[^…]只会求反单个字符。字符类始终匹配单个字符。因此,当您执行[^.dat]操作时,您并不是求反字符串“.dat”,而是匹配除“.”、“d”、“a”或“t”以外的单个字符

^((?!\.dat$)[\w\s:\.\\])*$
这只是对先前答案建议的评论:

.在字符类中,[]是一个文本。不需要转义

^((?!\.dat$)[\w\s:.\\])*$
我很抱歉将此作为一个新的解决方案发布,但我显然还没有足够的可信度对答案进行简单的评论

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

.在字符类中,[]是一个文本。不需要转义

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

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

这不是要求的,[^…]查找列表中没有的任何单个字符谢谢,这就是我想要的,但我错了。这与“.dat”和“~”匹配为正确。我还不明白为什么。这不是要求的,是[^…]查找列表中没有的任何单个字符谢谢,这是我的意思,但我错了。这与“.dat”和“~”匹配为正确。我还不明白为什么。不,我不知道,但我不想包含波浪号,我希望排除文件后缀“.pd~”和“.dat”它们被创建为临时文件。这样你就不必担心波浪形。因为波浪形根本不会出现在文件名中,所以你不必显式检查文件名是否以波浪形结尾。你可以使用第一个更简单的正则表达式。好吧,我明白你现在在字符组中包含波浪形的意思了。我不希望出现波浪形ilde将出现在我们将要使用的任何文件字符串中,但我将包括它以防万一。非常感谢!我花了几次尝试才了解我正在使用的程序是如何工作的,否则我会更快地回答。我是否正确理解,~或\.dat字符串与结尾的“$”匹配字符?因此,在继续之前,neg先行检查两个字符都不存在。如果是这样,我很感激这个参考,它比google教我的要好。两个建议的解决方案都会拒绝包含字符“~”的文件名,而不仅仅是以字符结尾。这不是OP的意图,好吧。我个人认为我的建议是be更清晰(而且正确!):@Bart:人们通常会发现自己的解决方案更清晰。我试着从他使用的东西开始修复它。不,我没有意识到,但我没有