从前面有任意长度的模式中提取字符串
本文关键字:模式 提取 字符串 前面 任意长 | 更新日期: 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
干得好,伙计们。雷鸟走了。