在color-rg中搜索 str1.*str2,可以查到 str1 and str2 这样的行,
但是如何可以同时查到 str2 and str1 这样的呢?要反过来查两次的话太麻烦了。
在color-rg中搜索 str1.*str2,可以查到 str1 and str2 这样的行,
但是如何可以同时查到 str2 and str1 这样的呢?要反过来查两次的话太麻烦了。
用分组操作,中间用一个 \|
或操作符号链接两个正则表达式
是这样么:str1.*str2\|str2.*str1
好像两组都查找不到了
\(str1.*str2\)\|\(str2.*str1\)
小括号也可能不用加斜杠。
括号加不加斜杠都搜不到
chino@asus-laptop:~/tmp/ccc$ cat testfile
foobarandbazqux
bazquxandfoobar
chino@asus-laptop:~/tmp/ccc$ rg '(foobar|bazqux).*(bazqux|foobar)' .
./testfile
1:foobarandbazqux
2:bazquxandfoobar
chino@asus-laptop:~/tmp/ccc$ rg '(foobar.*bazqux)|(bazqux.*foobar)' .
./testfile
1:foobarandbazqux
2:bazquxandfoobar
用了一下 color-rg-search-input-in-current-file
命令,搜索 (str1.*str2)|(str2.*str1)
就可以了,不用反斜杠转义。因为翻译成命令行的时候会自动转义
Perl 5 regexp:
/A|B/
/^(?=.*A)B/
/^(?:(?!A).)*$/
/(?=^(?:(?!A).)*$)B/
这个还会匹配到 foobarANDfoobar
和 bazquxANDbazqux
。
可以用,感谢,这下可以多一个搜索方式了
这个正则在rg中用好像不太一样,或条件写 /str1|str2/
搜不到,写成 (str1|str2)
就可以搜到
我主要是想用来搜索同时包含两个tag的笔记,每两个tag就要写两个小括号组合,如果要搜索三个tag,岂不是要写6个小括号组合
搞定,现在可以用空格来搜索多个关键词了,舒服。
(defun eye--build-or-regexp-by-keywords (keywords)
"构建or语法的正则"
(let (wordlist tmp regexp)
(setq wordlist (split-string keywords " "))
(dolist (word wordlist)
(setq tmp (format "(%s)" word))
(if regexp (setq regexp (concat regexp "|")))
(setq regexp (concat regexp tmp)))
regexp
))
(defun eye--build-and-regexp-by-keywords (keywords)
"构建and语法的正则"
(let (reg wlist fullreg reglist)
(setq wlist (split-string keywords " "))
(dolist (w1 wlist)
(setq reg w1)
(dolist (w2 wlist)
(unless (string-equal w1 w2)
(setq reg (format "%s.*%s" reg w2))))
(setq reg (format "(%s)" reg))
(add-to-list 'reglist reg)
)
;; 还要反过来一次
(dolist (w1 wlist)
(setq reg w1)
(dolist (w2 (reverse wlist))
(unless (string-equal w1 w2)
(setq reg (format "%s.*%s" reg w2))))
(setq reg (format "(%s)" reg))
(add-to-list 'reglist reg)
)
(dolist (r reglist)
(if fullreg (setq fullreg (concat fullreg "|")))
(setq fullreg (concat fullreg r)))
fullreg
))
(defun eye/search-or-by-rg ()
"以空格分割关键词,以or条件搜索多个关键词的内容
如果要搜索tag,可以输入`:tag1 :tag2 :tag3'
"
(interactive)
(let* ((keywords (read-string "Or Search(rg): "))
(regexp (eye--build-or-regexp-by-keywords keywords)))
(message "search regexp:%s" regexp)
(color-rg-search-input regexp)
))
(defun eye/search-and-by-rg ()
"以空格分割关键词,以and条件搜索同时包含多个关键词的内容
如果要搜索tag,可以输入`:tag1 :tag2 :tag3'
"
(interactive)
(let* ((keywords (read-string "And Search(rg): "))
(regexp (eye--build-and-regexp-by-keywords keywords)))
(message "search regexp:%s" regexp)
(color-rg-search-input regexp)
))