我认为我在C#中的正则表达式模式不正确

本文关键字:正则表达式 模式 不正确 | 更新日期: 2023-09-27 18:00:39

我正在检查正则表达式是否与字符串匹配。我有一个看起来像somename_somthing.txt的文件名,我想将其与somename_*.txt匹配,但当我试图传递应该匹配的内容时,我的代码失败了。这是我的密码。

string pattern = "somename_*.txt";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
using (ZipFile zipFile = ZipFile.Read(fullPath))
{
   foreach (ZipEntry e in zipFile)
   {
       Match m = r.Match("somename_something.txt");
       if (!m.Success)
       {
           throw new FileNotFoundException("A filename with format: " + pattern + " not found.");
        }
    }
}

我认为我在C#中的正则表达式模式不正确

星号匹配下划线并将其丢弃。

尝试:

somename_('w+).txt

此处的(''w+)将与此位置的组匹配。

你可以在这里看到它的匹配:https://regex101.com/r/qS8wA5/1

一般

此代码中的Regex give将_与*匹配,这意味着零个或多个下划线,而不是您想要的。*用于表示前一项中的零个或多个。请尝试

^somename_(.*)'.txt$

这与第一部分"somename_"完全匹配。

然后任何东西(.*)

最后是结尾".txt"。反斜杠转义"句点"。

更具体

你也可以说,如果你只想要字母,而不是数字或符号在匹配的中间部分:

^somename_[a-z]*'.txt$

编写时,您的正则表达式

somename_*.txt

匹配(不区分大小写):

  • 文字文本somename,后跟
  • 零个或多个下划线字符(_),后面跟
  • 任何字符(换行符除外),后跟
  • 文本txt

它将匹配源文本中任何处的。你可能想写一些类似的东西

Regex myPattern = new Regex( @"
    ^        # anchor the match to start-of-text, followed by
    somename # the literal 'somename', followed by
    _        # a literal underscore character, followed by
    .*       # zero or of any character (except newline), followed by
    '.       # a literal period/fullstop, followed by
    txt      # the literal text 'txt' 
    $        # with the match anchored at end-of-text
  " , RegexOptions.IgnoreCase|RegexOptions.IgnorePatternWhitespace
  ) ;

嗨,我认为模式应该是

string pattern = "somename_.*''.txt";

问候