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

我认为我在C#中的正则表达式模式是不正确的,c#,regex,C#,Regex,我正在检查正则表达式是否与字符串匹配。 我有一个文件名,看起来像somename\u somthing.txt,我想将它与somename\u*.txt匹配,但当我尝试传递应该匹配的内容时,我的代码失败了。这是我的密码 string pattern = "somename_*.txt"; Regex r = new Regex(pattern, RegexOptions.IgnoreCase); using (ZipFile zipFile = ZipFile.Read(fullPath)) {

我正在检查正则表达式是否与字符串匹配。 我有一个文件名,看起来像
somename\u somthing.txt
,我想将它与
somename\u*.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.");
        }
    }
}

一般来说

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

^somename_(.*)\.txt$
这与第一部分“somename_u2;”完全匹配

然后是任何内容(.*)

最后是“.txt”结尾。反斜杠避开了“点”

更具体

<>你也可以说,如果你只想要字母和数字或符号在比赛的中间部分:

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

嗨,我想图案应该是

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

关于

星号与下划线匹配并将其删除

尝试:

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


您可以在这里看到它的匹配:

如前所述,您的正则表达式

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
  ) ;

您也可以使用“^somename.*\\\\.txt$”强制字符串“定位”,这将对“a_somename_Somewhere.txt”失败。它没有做他希望它做的事情。谢谢@JBlaz,您的评论“这不起作用”和“它没有做他希望它做的事情”确实帮助我理解了我做错了什么(如果是这样的话)。我用一组数据测试了我的代码,效果很好。它取决于OP想要的“精确度”。正则表达式匹配的唯一文本是带有1个或多个斜杠的“somename.\.txt”。因此,出现了“这不起作用”的评论。之所以这样做是因为没有通配符组,.*与任何内容都不匹配。这两条斜线互相逃逸,与.txt中的点不匹配,我认为这是您想要的。所以,去掉一条斜线,把它分组。*这样做很好,但事实上,我引用“没有做他想做的事”。我想你误解了我的模式。事实上,它与以下内容相匹配:“somename\u name.txt”、“somename\u somename.zip.txt”、“something\u somename\u name.txt”。它与以下内容不匹配:“somename\u name.tif”、“somename.txt”、“somename\u”。别忘了我没有使用逐字逐句的字符串(就像在原来的问题中),所以我需要使用一个额外的斜杠来转义另一个。你也不需要为你的点分组。星号应用于前面的字符,因此“*”等于“(.)*”,但我认为最后一个字符将捕获点中出现的字符(我不是100%确定)。我认为这篇文章的标题没有反映问题。请推荐应该是什么,我会更改它。谢谢
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
  ) ;