当字符串出现两次时匹配的正则表达式

Vac*_*ano 14 regex

我对RegEx表达式很恐怖,我只是不经常使用它们来记住使用之间的语法.

我正在使用grepWin来搜索我的文件.我需要进行搜索,返回两次给定字符串的文件.

所以,例如,如果我在搜索单词"how",那么文件一不匹配:

你好
,今天好吗?

但文件二会:

你好
,今天好吗?

我很好,你好吗?

任何人都知道如何制作一个与之匹配的RegEx?

VMy*_*kyt 16

这样的事情(取决于语言和你的具体任务)

\(how.*){2}\
Run Code Online (Sandbox Code Playgroud)

编辑: 根据@CodeJockey

\^(([^h]|h[^o]|ho[^w])*how([^h]|h[^o]|ho[^w])*){2,2}$\
Run Code Online (Sandbox Code Playgroud)

(它变得更复杂)@CodeJockey:感谢您的评论

  • 这将使用"how"两次或多次获取文件,但不会**排除具有三次或更多次出现的**文件 (3认同)

Wis*_*guy 5

我不知道grepWin支持什么,但是这就是我想出来让两件事完全匹配的原因.

/^((?!how).)*how((?!how).)*how((?!how).)*$/
Run Code Online (Sandbox Code Playgroud)

说明:

/^             # start of subject
  ((?!how).)*  # any text that does not contain "how"
  how          # the word "how"
  ((?!how).)*  # any text that does not contain "how"
  how          # the word "how"
  ((?!how).)*  # any text that does not contain "how"
$/             # end of subject
Run Code Online (Sandbox Code Playgroud)

这可以确保您找到两个"如何",但"如何"和它们之间的文本不包含"如何".

当然,您可以用任何字符串替换表达式中的"how".


如果您只想通过两次编写搜索表达式来"简化",则可以使用反向引用:

/^(?:(?!how).)*(how)(?:(?!\1).)*\1(?:(?!\1).)*$/
Run Code Online (Sandbox Code Playgroud)

重写这个表达

说明:
我添加?:了使负向前瞻的文本不捕获.然后我在常规周围添加括号how以使其成为捕获子模式(第一个也是唯一一个).

我不得不在第一个前瞻中再次包含"如何",因为它是一个负向前瞻(意味着任何捕获都不包含"如何")并且此时捕获的"如何"还没有被捕获.