RegEx捕获特定的字符串

问题描述

大家好,我有问题。我正在尝试使用正则表达式来获取所有不以

结尾的行

_0.jpg
_s.jpg
_m.jpg
_l.jpg


示例行:


9Uikt / ifehr54mg__0.jpg
9Uikt / idg4hdmg2_s.jpg
9Uikt / igdffgggfmg4_m.jpg
9Uikt / img3teg3gegg7_l.jpg
9Uikt / imgerhw45h70。 jpg
9Uikt / imggq4ge37s.jpg
9Uikt / img3f37m.jpg
9Uikt / img34g3f7l.jpg
9Uikt / imgf3f34t4t73l_.jpg
9Uikt / imgf3f34t4t73l_2.jpg

我想要得到的大胆的东西。

9Uikit /和.jpg之间的任何字符都可以发生,但文件名中不允许的字符除外

“ *:?/ \ |

我已经尝试过此代码

.*(_(?![0-9][a-zA-Z])).*\.jpg

解决方法

您可以使用

^(?!.*_[0sml]\.jpg$).+\.jpg$

请参见regex demo

详细信息

  • .*-尽可能多的零个或多个除换行符以外的字符
  • (?!.*_[0sml]\.jpg$)-如果在当前位置的右边,有一个负前行,则匹配失败
    • .*-尽可能多的零个或多个除换行符以外的字符
    • _-下划线
    • [0sml]-一个0sml字符
    • \.-一个点
    • jpg-jpg字符串
    • $-字符串锚点的结尾
  • .+\.jpg$-除换行符之外的任何一个或多个字符,尽可能多的是.jpg字符串和字符串结尾。

或者,.*(?<!_[0sml])\.jpg$,如果您可以负担得起的话:

.*(?<!_[0sml])\.jpg$

请参见this regex demo。详细信息:

  • .*-尽可能多的零个或多个除换行符以外的字符
  • (?<!_[0sml])-不允许在左侧紧随_0sml字符 -\.jpg$-.jpg在字符串末尾。
,

您的问题陈述可能会稍微说明您可能要拒绝的其他组合。据我所知,您不想匹配“ 7_”,在这种情况下,负前瞻是要做的事

Perl正则表达式可能看起来像

    if(m/img(?!7_).*jpg/) {print}

请注意,SED和AWK不支持负前瞻,但您并未说明如何执行正则表达式

,

您可以简单地使用此正则表达式,我认为它更易于阅读和理解。

\w+\/?.*?_\w\.jpg

const testCases = [
  "9Uikt/img7_0.jpg","9Uikt/img7_s.jpg","9Uikt/img7_m.jpg","9Uikt/img7_l.jpg","9Uikt/img70.jpg","9Uikt/img7s.jpg","9Uikt/img7m.jpg","9Uikt/img7l.jpg","9Uikt/img7l_.jpg"
];

const re = /\w+\/?.*?_\w\.jpg/gi;

testCases.forEach(tc => {
  if (tc.match(re)) {
    console.log("Matched: " + tc);
  } else {
    console.log("Not matched: " + tc);
  }
});