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

时间:2011-11-18 17:25:28

标签: regex

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

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

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

  

您好
  你今天好吗?

但文件二会:

  

您好
  你今天好吗?

     

我很好,你好吗?

任何人都知道如何制作符合该标准的RegEx吗?

4 个答案:

答案 0 :(得分:15)

类似的东西(取决于语言和你的具体任务)

\(how.*){2}\

修改 根据@CodeJockey

\^(([^h]|h[^o]|ho[^w])*how([^h]|h[^o]|ho[^w])*){2,2}$\

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

答案 1 :(得分:5)

我不知道grepWin支持什么,但是我想出的是让匹配完全匹配两次。

/^((?!how).)*how((?!how).)*how((?!how).)*$/

说明:

/^             # 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

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

当然,你可以用任何字符串替换"如何"在表达中。


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

/^(?:(?!how).)*(how)(?:(?!\1).)*\1(?:(?!\1).)*$/

Refiddle with this expression

说明:
我添加了?:来做出否定的预测'文字不捕获。然后我在常规how周围添加括号,使其成为捕获子模式(第一个也是唯一一个)。

我必须包括"如何"再次在第一个前瞻中,因为它是一个负向前瞻(意味着任何捕获包含"如何")和捕获的"如何"此时尚未捕获。

答案 2 :(得分:1)

这比我原先想象的要困难得多,并且需要可变长度的lookbehind,grepWin不支持......

这个表达式:

 (?<!blah.{0,99999})blah(?=.*?blah)(?!.*blah.*blah)

在Eclipse中成功使用,使用“搜索&gt;文件”对话框排除包含一个和三个blah实例的文件,并包含恰好有两个blah实例的文件。

Eclipse不允许使用.*,因此我使用.{0,99999}代替。

使用正确的工具是可能的,但是使用grepWin并不是很好(参见上面的答案)。您可以使用其他工具(例如Eclipse)以及之后想要对文件做什么?

答案 3 :(得分:1)

这适用于 grep || python,仅当“how”在 your_file 中存在两次时才会返回匹配项:

grep "how.*how" your_file

在python中(重新导入):

re.search(r"how.*how","your_text")

它将返回两者之间的所有内容,(点表示任何字符,星号表示任意数量的字符),您可以自定义自己的脚本。