Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式以匹配后跟数字的字符串的特定模式_Regex - Fatal编程技术网

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

Regex 正则表达式以匹配后跟数字的字符串的特定模式,regex,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+,它只返回: 文件名2000 ed 不同文件名2000版 我看到这里有一个相关的Q+a: 例如,使

样本输入:

___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+
,它只返回:

文件名2000 ed
不同文件名2000版

我看到这里有一个相关的Q+a:


例如,使用
ed[0-9]*
将匹配
ed#
,但不确定其在上述情况下不匹配的原因。

如前所述,您的正则表达式是正确的。但是,请记住,正则表达式尝试从左到右匹配其语句。您的
ed\d+
永远不会匹配,因为您的
[A-Za-z]已经使用了ed
alternative.重新排序您的正则表达式,它就可以正常工作了:

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

您可以使用(只需抓取第一个捕获组):


参见

Nick的答案是正确的,但由于顺序匹配可能是一种不太可读的“gotcha”,因此进行此类搜索的最佳(不区分顺序)方法是1)使用指定的分隔符,2)使每个搜索词唯一

简的回答处理得很好。但您必须指定每个特定的分隔符,包括其长度(例如,
\uuuuuuuuu
)。听起来您可能有一些不寻常的分隔符,因此这可能不理想

对于#2,则可以使每个搜索词都是唯一的。(也就是说,您希望匹配“file”和“name”的对象与匹配“2000”的对象不同,并且两者都与匹配“ed2”的对象不同。)

一种方法是
[A-Za-z]+(?![0-9a-Za-z])|[\d]{4}|ed\d+
。这意味着对于第一种类型的搜索词,您需要一个字母字符串,后跟一个非字母数字字符。这使它与第三个搜索词不同,第三个搜索词是一个字母字符串,后跟一些数字。这还允许您指定其中的任何分隔符范围


零件首先与
ed
匹配,而其他替代品无法与
ed
之后的单个2匹配。您想要所有单独的匹配,还是想要单个匹配,如
^[A-Za-z]+(?:[A-Za-z]+)\d{4}ed\d+$
谢谢。我忘了从左到右的比赛了。有什么方法可以避免担心从左到右的比赛吗?没有。您无法绕过引擎从左到右读取您的输入模式,但对于某些模式,您可以滥用正则表达式的行为,首先使用贪婪的量词使其“从右到左”读取匹配项。然而,从右向左阅读并非如此;它尽可能地匹配,然后从比赛结束时开始回溯。就你的例子来说,这是不可能的。一个小问题——你答案的中间部分([a-zA-Z0-9]{2,})本身就抓住了我需要的东西。你能简单地解释一下你为什么包括另外两部分吗?谢谢
(?:^|___|[+(])    # delimiter before
([a-zA-Z0-9]{2,}) # the actual content
(?=$|___|[+)])    # delimiter afterwards