样本输入:
___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#
,但不能确定为什么上面的内容不匹配。
答案 0 :(得分:3)
按照书面规定,您的正则表达式正确。但是请记住,正则表达式尝试从左到右匹配其语句。您的ed\d+
永远不会匹配,因为您的[A-Za-z]
替代品已经
ed\d+|[a-zA-Z]+|\d{4}
答案 1 :(得分:2)
Nick的答案是正确的,但是由于顺序匹配可能是一个不太容易理解的“陷阱”,因此进行此类搜索的最佳方式(不区分顺序)是1)使用指定的分隔符,以及2)通过使每个分隔符搜索字词唯一。
Jan的答案很好地处理了#1。但是您必须指定每个特定的定界符,包括其长度(例如___
)。听起来您可能有一些不同寻常的分隔符,所以这可能并不理想。
那么,对于#2,您可以使每个搜索词都唯一。 (也就是说,您希望与“文件”和“名称”匹配的事物与与“ 2000”匹配的事物相区别,并且与与“ ed2”匹配的事物相区别。)
一种执行此操作的方法是[A-Za-z]+(?![0-9a-zA-Z])|[\d]{4}|ed\d+
。这就是说,对于第一种类型的搜索词,您需要一个字母字符串,后跟一个非字母数字字符。这使其与第三个搜索词有所区别,第三个搜索词是字母字符串,后跟一些数字。这也使您可以在该negative lookbehind内指定任意范围的定界符。
答案 2 :(得分:1)
您可能会很好用(只需抓住第一个捕获组):
(?:^|___|[+(]) # delimiter before
([a-zA-Z0-9]{2,}) # the actual content
(?=$|___|[+)]) # delimiter afterwards