1

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

4 回答 4

5

您想使用负前瞻

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

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

^((?!~$|\.dat$)[\w\s:\.\\~])*$
于 2009-10-08T17:33:37.147 回答
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' 之外的单个字符。

于 2009-10-08T18:16:25.547 回答
2
^((?!\.dat$)[\w\s:\.\\])*$

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

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

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

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

于 2009-10-08T18:20:12.247 回答
-2

我相信你正在寻找这个:

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

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

^[\w\s:\.\\]*([^~]|[^\.dat])$
于 2009-10-08T17:38:32.627 回答