正则如何搜索同时包含两个字符串的条件?

在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/                                                                                                                                                                                   
2 个赞

这个还会匹配到 foobarANDfoobarbazquxANDbazqux

可以用,感谢,这下可以多一个搜索方式了

这个正则在rg中用好像不太一样,或条件写 /str1|str2/ 搜不到,写成 (str1|str2) 就可以搜到

我主要是想用来搜索同时包含两个tag的笔记,每两个tag就要写两个小括号组合,如果要搜索三个tag,岂不是要写6个小括号组合 :joy:

搞定,现在可以用空格来搜索多个关键词了,舒服。


(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)
    ))
1 个赞