我认为我在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
) ;