【问题标题】:Simple regex in GruntfileGruntfile 中的简单正则表达式
【发布时间】:2013-06-09 01:16:49
【问题描述】:

我的Gruntfile 中有以下行。

js files: ['<%= yeoman.app %>/scripts/{,*/}*.coffee'],

谁能告诉我{,*/}* 是什么意思?我知道它正在尝试匹配脚本文件夹中的所有 .coffee 文件,但我想知道它是如何做到的。

【问题讨论】:

标签: gruntjs glob


【解决方案1】:

{,*/} 匹配脚本和 .coffee 文件之间的一个或零个目录。 {} 内部实际上有两个匹配项,用逗号分隔。一个是空白,由逗号左侧没有字符表示。一个是任意数量的字符和一个正斜杠。最后的 * 与 .coffee 扩展名之前的文件名匹配。

顺便说一句,这不是正则表达式,它是通配符。

【讨论】:

  • 谢谢。我仍然不清楚为什么正斜杠需要在{} 中。 {,*}/* 是什么意思?
  • 嗨 Tri,您需要 / 的原因是在通配符中 * 匹配除实际斜杠之外的所有字符。它是这样设置的,例如,通配/*/*/* 仅查找位于目录树中两个目录深度的文件。 {,*}/* 只会匹配有斜线的路径,而{,*/}* 使斜线可选。
  • 感谢您的回答。这就说得通了。但是,如果是这样,那为什么不是{,*,/}*,基本上是加一个逗号分隔斜线和星号?
  • 我应该说“{,*/}* 使目录和斜杠成为可选”,而不仅仅是“使斜杠成为可选”。如果您执行{,*,/}*,那么您将匹配: 1. 什么都没有 2. 一些没有斜杠的字符,这将没有效果,因为 } 之后的 * 已经允许这些字符 3. 只是一个斜杠 - 所以它会只匹配scripts//,这将是一条奇怪的路径。您需要 {,*/}* 以便匹配 scripts/anythinghere/file.coffeescripts/file.coffee 。注意这与scripts/anythinghere/somethingelsehere/file.coffee 不匹配。
  • 对上一条评论是,对之前的评论否。 */ 表示“除斜线之外的任何字符,重复任意次数,后跟一个斜线。”斜线必须在末尾,因为这是正则表达式中的顺序。它不会“结合”。
【解决方案2】:

根据the documentation

此外,由于这是 JavaScript,因此您不仅限于 JSON;你可以 在此处使用任何有效的 JavaScript。您甚至可以以编程方式生成 必要时进行配置。

看起来 {,*/}*JSON 匹配:

{
 '' = empty space matches no character
 , = or
 * = Any Characters (except slash) (wildcard)
 / = literal slash
}
* = Any Characters (except slash) (wildcard)

更新Found another resource:

通配模式

单独指定所有源文件路径通常是不切实际的, 所以 Grunt 通过 内置 node-glob 和 minimatch 库。

虽然这不是关于通配模式的综合教程,但请了解 在文件路径中:

* 匹配任意数量的字符,但不匹配 /

?匹配单个字符,但不匹配 /

** 匹配任意数量的字符,包括 /,只要它是路径部分中的唯一内容

{} 允许使用逗号分隔的“或”表达式列表

!在模式的开头将否定匹配

【讨论】:

  • @SindreSorhus 你有资源可以告诉我们它的含义吗?有趣的是,我有一个-1,而另一个答案相同的人有一个+1。是你吗?
  • 您好,绝对...不知道 Sindre 怎么了——我们的答案确实是一样的。我刚刚投了你的赞成票。
  • 我也只是将 Sindre 的评论标记为不具建设性。
猜你喜欢
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多