从任何长度前面的模式中提取字符串

时间:2016-02-29 19:18:03

标签: c# .net regex

我正在寻找一个正则表达式来从文件名中提取字符串

例如,如果文件名格式为" anythingatallanylength_123_TESTNAME.docx",我有兴趣提取" TESTNAME" ...可能固定长度为8.(顺便说一下,123可以是任意三位数字)

我想我可以使用正则表达式匹配... " * _ [0-9] [0-9] [0-9] _ [AZ] [AZ] [AZ] [AZ] [AZ] [AZ] [AZ] [AZ] .DOCX $ "

然而,这与整个事情相符。我怎样才能获得" TESTNAME"?

由于

4 个答案:

答案 0 :(得分:1)

使用括号匹配整个正则表达式的特定部分。 您还可以使用花括号指定匹配字符的计数,并使用\ d表示[0-9]。

在C#中:

var myRegex = new Regex(@"*._\d{3}_([A-Za-z]{8})\.docx$");

现在" TESTNAME"或者你的8个字母的部分将在你使用它后的正则表达式的捕获集合中找到。

另请注意,正如其他一些解决方案所示,前瞻和后视将会产生性能开销。

答案 1 :(得分:0)

您可以使用后视和前瞻来检查零件而不匹配它们:

(?<=_[0-9]{3}_)[A-Z]{8}(?=\.docx$)

请注意,这是区分大小写的,您可能希望使用其他字符类和/或量词来满足您的确切模式。

答案 2 :(得分:0)

以您的文件名格式“anythingatallanylength_123_TESTNAME.docx”,您尝试匹配的模式是string之前的.docx和下划线_。记住以前任何_都不匹配的事情,我提出了以下解决方案。

正则表达式: (?<=_)[A-Za-z]*(?=\.docx$)

使用的标志:

  • g全球搜索
  • m多行搜索。

<强>解释

  • (?<=_)检查文件名前是否有underscore
  • (?=\.docx$)检查最后的延期。
  • [A-Za-z]*检查所需的匹配。

Regex101 Demo

答案 3 :(得分:0)

感谢@Lucero @noob @JamesFaix我想出了......

@ “(小于?= * [0-9] {3} )[A-Z] {8}(?= DOCX $)”

所以看一下(括号中,以?&lt; =开头)任何东西(即零或多个任何字符(用“。”表示)后跟一个下划线,然后是数字,然后是下划线。这就是后面的结尾。现在匹配我需要的东西(八个字母)。最后,向前看(在括号中,以?=开头),即.docx

好的工作,伙计们。雷鸟飞走了。