我对RegEx表达式很恐怖,我只是不经常使用它们来记住使用之间的语法。
我正在使用grepWin搜索我的文件。我需要进行搜索,返回给定字符串两次的文件。
所以,例如,如果我在搜索单词"如何",那么文件一不匹配:
您好
你今天好吗?
但文件二会:
您好
你今天好吗?我很好,你好吗?
任何人都知道如何制作符合该标准的RegEx吗?
答案 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).)*$/
说明:
我添加了?:
来做出否定的预测'文字不捕获。然后我在常规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")
它将返回两者之间的所有内容,(点表示任何字符,星号表示任意数量的字符),您可以自定义自己的脚本。