【问题标题】:How to create a regex that matches two or more specific whole words?如何创建匹配两个或多个特定整个单词的正则表达式?
【发布时间】:2018-03-21 00:45:42
【问题描述】:

目的

该 RegEx 的目的是在 Sublime Text 3 支持正则表达式的“文件搜索”功能上使用它。

目标

我的目标是实现在特定文件名上查找特定完整单词的搜索,一个优点是文件名被定义为文件本身内部的字符串,所以它可能会使事情变得更容易。

我的扣除

我在考虑如何执行它,我意识到如果我可以创建一个在同一个文件中搜索两个完整单词的正则表达式,它就解决了我的问题,因为文件名也在文件中。

示例:

我有许多名为 ListaController 的文件,我只想找到其中包含 requires: 的文件。

ListaController 是我要搜索的文件的名称。

requires: 是我想找到 ListaController's 的 insile 文件的词

所以我需要一个可以在同一个文件上匹配(ListaControllerrequires:)的正则表达式,以仅显示两个单词匹配的文件。

我尝试过的

我最接近的是 RegEx:

\bListaController\b|\brequires:\b

这导致我只有ListaController 整个单词的结果,而没有requires: 的结果。

所以我需要一些帮助来创建适合的正则表达式。

Obs:如果有一个更简单/更好的解决方案可以在不使用正则表达式的情况下在 sublime 上执行我想要的操作,我将不胜感激,也许这将是我的最终解决方案。

【问题讨论】:

  • Searching 9563 files for "\bListaController\b|\brequires:" (regex) ... 结果是具有requires: 而不是ListaControllers 的文件
  • 那么你真的想找到里面有ListaControllerrequires:的文件,或者你想找到里面有ListaControllerrequires:的文件?你说过 “我有很多名为 ListaController 的文件,我只想找到那些需要的文件:在其中。”“所以我需要一个可以在同一个文件上匹配(ListaController 和需要:) 的正则表达式“
  • 您不能在 where 字段中使用正则表达式,因为它只接受不支持单词边界的 glob 模式。因此,您需要在正则表达式字段中使用\brequires: 正则表达式,并且在 where 字段中,您可以使用类似* ListaController * 的内容来检查在空格内包含单词的文件,然后是任何其他搜索词周围可能的特殊字符组合。
  • @David 很抱歉这句话令人困惑,但请看,它们都解决了我的问题,“ListaControllerrequires: 都在里面;”和“名为ListaController 的文件,其中包含includes:。”解决我的问题的原因是我的文件名为ListaController 的名称在它们的第一行定义为字符串。看看为什么这两种方法可以解决我的问题?
  • 好的,那么您仍然可以使用(?s)^(?=.*?\bListaController\b)(?=.*?\brequires:) - 它会在包含整个单词ListaControllerrequires: 的任何文件中找到匹配项。

标签: regex search sublimetext3


【解决方案1】:

\bListaController\b|\brequires:\b 模式对于当前任务不正确,因为它搜索整个单词 ListController | 是一个 alternation operatorrequires: 被括起来带有单词字符(数字、字母或_)。

您希望匹配包含 ListControllerrequires: 作为整个单词的文件,这可以通过在两个模式之间交替使用 .* 或仅使用基于 lookahead 的正则表达式来实现。后一种类型实际上是首选,因为它不那么麻烦,并且只需要使用一次子模式。

你可以使用

(?s)\A(?=.*?\bListaController\b)(?=.*?\brequires:)

请参阅regex demo

详情

  • (?s) - 一种 DOTALL 模式,使 . 可以匹配默认情况下不匹配的换行符
  • \A - 文件开头
  • (?=.*?\bListaController\b) - 一个正向前瞻,需要任何 0+ 个字符,尽可能少(*? 是一个惰性量词),直到一个完整的单词 ListaController,包括它紧邻字符串中当前位置的右侧(也就是说,从文件的开头)
  • (?=.*?\brequires:) - 一个正向前瞻,需要任何 0+ 个字符,尽可能少,直到整个单词 requires: 包括紧邻字符串中当前位置的右侧(即再次从文件,因为前瞻是零宽度断言,当它们的模式匹配时不会移动正则表达式索引。)

【讨论】:

  • 这非常详细和解释,完全回答了我的问题,显然是正确的答案,所以我标记了它。这样做是为了将来参考,直接回答问题的标题。 即使更容易解决的问题是问题是不涉及正则表达式的更简单的事情。(没关系,这是一个加号。)
【解决方案2】:

如果您要在文件中搜索字符串,您可以使用文件名过滤器,使用“Where”功能。将requires: 放在查找框中,将*ListaController* 放在位置框中

【讨论】:

  • 看,我试图把*ListaController* 放在哪里框和requires: 在查找框。它可以工作,但是,它会在我拥有的所有项目中搜索整个上下文,而不是只搜索我指定的文件夹。
  • 在where框中,可以放多个过滤器,点击where框右侧的按钮,然后点击add folder
  • 现在,它完全解决了我的问题,但问题是“如何创建一个匹配两个或更多特定整个单词的正则表达式”所以我想知道我对这个答案/问题做了什么。
  • 没关系,自 1987 年以来我们就按照 Perl 所说的去做:“有不止一种方法可以做到”
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多