为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式可选择匹配文件名末尾的 3 位数字

正则表达式可选择匹配文件名末尾的 3 位数字

C#
慕无忌1623718 2022-10-15 14:09:48
我一生都无法弄清楚如何让这些匹配:File name without 3 digit end.jpgFile name with 3 digit 123.gifSingle 123.jpgSingle.png但不是这些:Single 1.jpgSingle 123b.gifMore words 123b.png到目前为止,我能做到的最好的就是这个表达式:^[^\s]((?!\s{2})(?!,\S).)*\b(\p{L}+|\d{3})\.\w{3}$但它无法匹配Single.png,仍然匹配Single 123b.gifand More words 123b.png。我想我明白为什么它不起作用,但我不知道如何让它正确,我一直在努力和谷歌搜索 2 天。我的完整规则是:在文件扩展名之前可以选择正好 3 个数字,3 个字母的文件扩展名,文件名中没有双空格,逗号之后但不是逗号之前有一个空格。
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

您可以使用包含 3 个数字或一系列非数字的交替组,前面有一个单词边界断言:

^.*?\b(?:\d{3}|\D+)\.\w{3}$

演示:https ://regex101.com/r/A9iSVE/3


查看完整回答
反对 回复 2022-10-15
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

为了将您的要求考虑到逗号和双空格,一种选择可能是使用 2 个负前瞻来断言字符串不包含双空格并且在逗号之前不包含空格。

\s如果要匹配空白字符而不是单个空格,则可以使用。

^(?!.*[ ]{2})(?!.* ,).*\b(?:\p{L}+|\d{3})\.\w{3}$

那将匹配

  • ^字符串的开始

  • (?!.*[ ]{2})断言不是 2 个空格

  • (?!.* ,)断言不是一个空格和一个逗号

  • .*\b匹配任何字符 0+ 次,后跟单词边界

  • (?:\p{L}+|\d{3})匹配 1+ 次字母或 3 位数字

  • \.\w{3}匹配.和 3 个单词字符

  • $字符串结束

正则表达式演示C# 演示


查看完整回答
反对 回复 2022-10-15
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

您可以在不回溯的情况下满足指定的规则(当前接受的答案就是这样)。指定的规则是(为了清楚起见重新措辞):文件名必须满足以下条件:

  • 它不得包含多个空格字符的序列。

  • 逗号后面必须有一个空格字符。

  • 文件名词干可以有一个 3 位数的后缀。

  • 文件扩展名必须由 3 个字母组成。

为此:

^(?<prefix>[^, ]+(,? [^, ]+)*)(?<suffix>\d\d\d)?(?<extension>.\p{L}\p{L}\p{L})$

会成功的,没有花哨的前瞻,没有回溯。分解成碎片,你会得到:

^                  # * match start-of-text, followed by

(?<prefix>         # * a named group, consisting of

  [^,\x20]+        #   * 1 or more characters other than comma or space, followed by

  (                #   * a group, consisting of

    ,?             #     * an optional comma, followed by

    \x20           #     * a single space character, followed by

    [^,\x20]+      #     * 1 or more characters other than comma or space

  )*               #     with the whole group repeated zero or more times

)                  #   followed by

(?<suffix>         # * an optional named group (the suffix), consisting of

  \d\d\d           #   * 3 decimal digits

)?                 #   followed by

(?<extension>      # * a mandatory named group (the filename extension), consisting of

  .\p{L}\p{L}\p{L} #   * 3 letters.

)                  #   followed by

$                  # end-of-text


查看完整回答
反对 回复 2022-10-15
  • 3 回答
  • 0 关注
  • 268 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信