正则表达式以匹配特定的字符串模式,后跟数字

时间:2019-10-30 14:25:28

标签: regex

样本输入:

___file___name___2000___ed2___1___2___3
DIFFERENT+FILENAME+(2000)+1+2+3+ed10

所需的输出(例如,所有字母和4位数字和立即数'ed',后跟任意长度的数字:

file name 2000 ed2
DIFFERENT FILENAME 2000 ed10

我正在使用: [A-Za-z]+|[\d]{4}|ed\d+仅返回: file name 2000 ed DIFFERENT FILENAME 2000 ed

我看到这里有一个相关的Q + A:Regular Expression to match specific string followed by number?

例如,使用ed[0-9]*会匹配ed#,但不能确定为什么上面的内容不匹配。

3 个答案:

答案 0 :(得分:3)

按照书面规定,您的正则表达式正确。但是请记住,正则表达式尝试从左到右匹配其语句。您的ed\d+永远不会匹配,因为您的[A-Za-z]替代品已经已使用ed 。重新排序您的正则表达式,它将正常工作:

ed\d+|[a-zA-Z]+|\d{4}

Demo

答案 1 :(得分:2)

Nick的答案是正确的,但是由于顺序匹配可能是一个不太容易理解的“陷阱”,因此进行此类搜索的最佳方式(不区分顺序)是1)使用指定的分隔符,以及2)通过使每个分隔符搜索字词唯一。

Jan的答案很好地处理了#1。但是您必须指定每个特定的定界符,包括其长度(例如___)。听起来您可能有一些不同寻常的分隔符,所以这可能并不理想。

那么,对于#2,您可以使每个搜索词都唯一。 (也就是说,您希望与“文件”和“名称”匹配的事物与与“ 2000”匹配的事物相区别,并且与与“ ed2”匹配的事物相区别。)

一种执行此操作的方法是[A-Za-z]+(?![0-9a-zA-Z])|[\d]{4}|ed\d+。这就是说,对于第一种类型的搜索词,您需要一个字母字符串,后跟一个非字母数字字符。这使其与第三个搜索词有所区别,第三个搜索词是字母字符串,后跟一些数字。这也使您可以在该negative lookbehind内指定任意范围的定界符

demo

答案 2 :(得分:1)

您可能会很好用(只需抓住第一个捕获组):

(?:^|___|[+(])    # delimiter before
([a-zA-Z0-9]{2,}) # the actual content
(?=$|___|[+)])    # delimiter afterwards

请参见a demo on regex101.com