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

本文关键字:模式 提取 字符串 前面 任意长 | 更新日期: 2023-09-27 18:36:50

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

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

我想我可以使用正则表达式匹配...".*

_[0-9][0-9][0-9]_[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z].docx$"

然而,这与整个事情相匹配。我怎样才能只得到"测试名称"?

谢谢

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

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

在 C# 中:

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

现在,"TESTNAME"或任何您的 8 个字母片段将在使用它后在您的正则表达式的捕获集合中找到。

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

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

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

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

在文件名格式"anythingatallanylength_123_TESTNAME.docx"中,您尝试匹配的模式是.docx之前的string,下划线_。请记住,之前的任何_都不匹配,我想出了以下解决方案。

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

使用的标志:

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

解释:

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

正则表达式 101 演示

多亏了我想出@Lucero @noob @JamesFaix...

@"(?<=.*[0-9]{3})[A-Z]{8}(?=.docx$)"

因此,在后面(在括号中,以 ?<= 开头)查看任何内容(即零个或多个任何字符(用"表示)。 ) 后跟下划线,后跟数字,后跟下划线。这就是后面的结局。 现在匹配我需要的(八个字母)。最后,展望未来(在括号中,以 ?= 开头),这是.docx

干得好,伙计们。雷鸟走了。