正则表达式捕获特定字符串

RegEx capture specific string

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

结尾的行

_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 char
    • \. - 一个点
    • 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);
  }
});