【问题标题】:Regex to append extension to file path正则表达式将扩展名附加到文件路径
【发布时间】:2021-07-24 05:02:01
【问题描述】:

我正在尝试运行一个 GitHub 操作链接检查器来检查降价文件中的 URL。我有一个 Jekyll 网站。

链接检查器会查找文件,而不是完整的 URL,因此:

这失败了 - /docs/article1/

但这有效 - /docs/article1.md

我有以下适用于大多数用例的重写:

{
  "pattern": "(\\S+)\/(\\s|$)",
  "replacement": "$1$2"
}

但是,如果链接中缺少尾部斜杠,则它不起作用。

有人可以推荐一个正则表达式更新,它将捕获:

  • /docs/article1/
  • /docs/article1

并改写为/docs/article1.md?

【问题讨论】:

  • (\\S+)\/?(\\s|$) 可能会有所帮助。 “?” tell - 匹配前一个元素的 1 次或 0 次出现。对于替换 $1$2\.md 应该可以完成这项工作。

标签: regex regexp-replace


【解决方案1】:

如果你要检查的字符串总是

/<name>/<name>[/]

那么 (\S+?)\/(\S+?)\/?$ 有替换 $1/$2.md 应该管用。 (regex101 link)

正则表达式解释

( // 第 1 组 \\S+? // 任何字符,大于 1,惰性(直到有 '/') ) // 关闭组 1 \/ // 名字之间的'/' ( // 第 2 组 \\S+? // 任何字符,大于 1,惰性(直到有 '/' 或 $(end of line)) ) // 关闭组 2 \/? // 如果有关闭 '/' 则忽略 $ // 行尾

(这是一个显示它有效的 sn-p)

let reg = {
  "pattern": "(\\S+?)\/(\\S+?)\/?$",
  "replacement": "$1/$2.md"
};

let tests = ["/a/b","/a/b/","/document/data/", "/document/data", "/docs/article1/", "/docs/article1"];

// run RegExp replace on every one from tests
tests.forEach(e => {
  let replaced =
  e.replace(new RegExp(reg.pattern), reg.replacement)
   console.log(e, "=>", replaced)
})

来自here

? 字符附加到量词使其变得懒惰;它使正则表达式引擎匹配尽可能少的匹配项

来自here

默认情况下,*+ 这样的量词是“贪婪的”,这意味着它们会尝试匹配尽可能多的字符串。量词后面的? 字符使量词“非贪婪”:意味着一旦找到匹配项就会停止。

【讨论】:

    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2020-03-11
    • 2013-03-18
    • 1970-01-01
    • 2017-04-08
    • 2010-12-21
    相关资源
    最近更新 更多