【问题标题】:How to match filename words without the extension using regex?如何使用正则表达式匹配没有扩展名的文件名单词?
【发布时间】:2020-07-25 10:27:10
【问题描述】:

我想匹配文件名中不带下划线 (_) 和文件扩展名等字符的单词。例如,如果我有文件 image_one.jpg 和 image_two.png 那么我如何才能只匹配 image one 和 image two?我不确定如何排除下划线和 .extension。

到目前为止,我有\w*_\w*,但它与包含下划线的文件名匹配,即image_one 和image_two

【问题讨论】:

  • 考虑在不使用正则表达式的情况下分多个步骤进行。首先通过拆分字符串删除扩展名,然后过滤掉下划线并将其加入。
  • elclanrs 提出了一个很好的建议。如果您需要过滤掉下划线,或者多于下划线,总有 string.replace() 来帮助您。
  • 谢谢@elclanrs

标签: javascript regex regex-negation regex-group


【解决方案1】:

您的模式 \w*_\w* 也可能匹配单个 _,因为单词字符是可选的。

由于\w 也匹配下划线,您可以使用否定字符类将其从\w 中排除。[^\W_]。

要获取这两个值,您可以使用 2 个捕获组,如果模式必须只匹配字符串末尾,您可以在末尾添加 $。

([^\W_]+)_([^\W_]+)\.\w+

说明

  • ([^\W_]+) 捕获组 1,匹配 1+ 次除 _ 之外的单词字符
  • _ 匹配下划线
  • ([^\W_]+) 捕获组 2,与组 1 相同
  • \.\w+ 匹配 . 和 1+ 个单词字符(或者更准确地说是 \.(?:jpg|png))

查看Regex demo

const regex = /([^\W_]+)_([^\W_]+)\.\w+/;
[
  "image_one.jpg",
  "image_two.png"
].forEach(s => console.log(s.match(regex).slice(1)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2012-06-05
    • 2013-10-16
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多