Regex 正则表达式是否可以匹配?

Regex 正则表达式是否可以匹配?,regex,match,digits,Regex,Match,Digits,我有以下文件名的文件: ZATR0008_2018.pdf ZATR0018_2018.pdf ZATR0218_2018.pdf 其中ZATR后的4位数字是杂志的发行号 使用此正则表达式: ([1-9][0-9]*)(?=_\d) 我可以提取8,18或218,但我希望保留最少2位数字,最多3位数字,因此结果应该是08,18和218 这怎么可能呢 ([1-9]\d{2,3})(?=_\d) {x,y}将从x到y匹配上一个模式,在本例中为\d 编辑:从您自己的正则表达式中,它看起来像您想要的

我有以下文件名的文件:

ZATR0008_2018.pdf
ZATR0018_2018.pdf
ZATR0218_2018.pdf
其中
ZATR
后的4位数字是杂志的发行号

使用此正则表达式:

([1-9][0-9]*)(?=_\d)
我可以提取
8
18
218
,但我希望保留最少2位数字,最多3位数字,因此结果应该是
08
18
218

这怎么可能呢

([1-9]\d{2,3})(?=_\d)
{x,y}将从x到y匹配上一个模式,在本例中为\d

编辑:从您自己的正则表达式中,它看起来像您想要的数字中以非零开头的部分。但是,由于您的示例中包含前导0,因此您可能真的想要:

   (\d{2,3})(?=_\d)
这将给出下划线前的最后3位数字,除非只有2位

{x,y}将从x到y匹配上一个模式,在本例中为\d

编辑:从您自己的正则表达式中,它看起来像您想要的数字中以非零开头的部分。但是,由于您的示例中包含前导0,因此您可能真的想要:

   (\d{2,3})(?=_\d)
这将给出下划线前的最后3位数字,除非只有2位

您可以使用

0*(\d{2,3})_\d
并获取组1的值。看

详细信息

  • 0*
    -零个或更多
    0
    字符
  • (\d{2,3})
    -第1组:两位或三位数字
  • \ud
    -一个
    \uu
    后跟一个数字
以下是一个PCRE变体,它将您需要的值捕获到整个匹配中:

0*\K\d{2,3}(?=_\d)

在这里,
\K
使正则表达式引擎忽略到目前为止匹配的文本(零),然后匹配2到3个数字,后跟
\u
和一个数字。

您可以使用

0*(\d{2,3})_\d
并获取组1的值。看

详细信息

  • 0*
    -零个或更多
    0
    字符
  • (\d{2,3})
    -第1组:两位或三位数字
  • \ud
    -一个
    \uu
    后跟一个数字
以下是一个PCRE变体,它将您需要的值捕获到整个匹配中:

0*\K\d{2,3}(?=_\d)

在这里,
\K
使正则表达式引擎省略到目前为止匹配的文本(零),然后匹配2到3个数字,后面跟有
\u
和一个数字。

我建议您:

^ZATR0*(\d{2,3})_\d+\.pdf$
演示代码。结果:

匹配1完全匹配0-17
ZATR0008_2018.pdf
1组。6-8
08

第2组完全匹配18-35
ZATR0018_2018.pdf
1组。24-26
18

第3组完全匹配36-53
ZATR0218_2018.pdf
1组。41-44
218

我建议你:

^ZATR0*(\d{2,3})_\d+\.pdf$
演示代码。结果:

匹配1完全匹配0-17
ZATR0008_2018.pdf
1组。6-8
08

第2组完全匹配18-35
ZATR0018_2018.pdf
1组。24-26
18

第3组完全匹配36-53
ZATR0218_2018.pdf
1组。41-44
218

或许:

(?:[1-9][0-9]+|[0-9]{2})(?=_[0-9])
(,它声称使用XRegExp库,您在另一个答案中提到的,似乎没有回到
(?:)在我的第一个建议中,如果需要的话,这使得它与我以前遇到的任何正则表达式引擎都非常不同,而且它更喜欢只匹配
218的
18
,即使它在字符串中开始得较晚。但它确实适用于我的第二个建议

或许:

(?:[1-9][0-9]+|[0-9]{2})(?=_[0-9])

(,它声称使用XRegExp库,您在另一个答案中提到的,似乎没有回到
(?:)在我的第一个建议中,如果需要的话,这使得它与我以前遇到的任何正则表达式引擎都有很大的不同,而且它更喜欢只匹配
218的
18
,即使它在字符串中开始较晚。但是它确实与我的第二个建议配合使用。

感谢Tommaso为我指明了正确的方向。但是如果我是否只匹配数字(无组)示例08、18、218?我需要在应用程序中传递正则表达式以提取我的问题(如示例08、18、218)。我没有像saerch和replace这样的字段,我可以在其中定义$1、$2这样的组。因此我需要确定并匹配问题。@TommasoBelluzzo听起来像是应用程序需要正则表达式,而不是正则表达式的结果,整个正则表达式只需要匹配所需的数字。我在回答中尝试了这一点,感谢Tommaso为我指明了正确的方向。但是如果我只想匹配数字(不带组)示例08、18、218?我需要在应用程序中传递正则表达式以提取我的问题(如示例08、18、218)。我没有像saerch和replace这样的字段,我可以在其中定义$1、$2这样的组。因此我需要确定并匹配问题。@TommasoBelluzzo听起来像是应用程序需要正则表达式,而不是正则表达式的结果,整个正则表达式只需要匹配所需的数字。我在回答中尝试了这一点。你的应用程序需要什么类型的正则表达式?什么类型您的应用程序是否期望使用正则表达式?您好,因为我是正则表达式的初学者,我想知道如何(以及是否可能)使您的解决方案成为“一个组”。我的意思是,在搜索和替换为正则表达式时,可以这样做:如果字符串是例如ZATR0008_2018.pdf,正则表达式是(\D{4})(\D{4})(\D{4})(.pdf)我可以为ZATR_2018.pdf的结果重新组装像$1$3$4这样的代币,但是我如何定义你的(?[1-9][0-9]+|[0-9]{2}(?={[0-9])可以用来替换的单个组?只需在整个事情周围添加()或删除
?:
Hi ysth,因为我是正则表达式的初学者,我想知道如何(如果可能的话)生成你的解决方案“a组”。我的意思是,在搜索和替换为正则表达式时,可以这样做:如果字符串是例如ZATR0008_2018.pdf,正则表达式是(\D{4})(\D{4})(.pdf),我可以为ZATR{u 2018.pdf的结果重新组合令牌,比如$1$3$4,但是我如何定义你的(?[1-9][0-9]+[0-9]{2})(?=[0-9]))可以用来替换的单个组?只需在整个内容周围添加()或删除
?: