[求助] 关于elisp正则的精确不匹配

关于elisp正则一直有个疑问,如何精确的不匹配特定内容。

  1. test unmatched string
  2. {[test unmatched string]}
  3. {test unmatched string}
  4. [test unmatched string]

例如我想匹配 “test unmatched string” 这个字符串,但是不包含2的情形,即前后有 “{[” 和 “]}” ,除了2以外其他任何情形都可以匹配,比如 3,4 等。请问大佬们这样的 elisp 正则该如何写?

尝试过 用 “[^ ]” 这种反选,但是它只能匹配单个字符,无法匹配连在一起的字符串。貌似正则表达式的设计都是以单个字符为基准的,不知道字符串的不匹配如何表达。

正则应该写不出来,看来只能手动回溯了。

try this one:

正则有零宽断言

1 个赞

如果字符串不是从第一个字符开始匹配就不行了吧?不知道楼主的本意是不是这个

不知道 elisp 是如何,一般的正则有 zero-width negative lookbehind (?<!X) 和 zero-width negative lookahead (?!X),可以用来判断前后是否符合。

1 个赞

谢谢,我想要的应该不是这个。上面的例子只是我随便列的,我想匹配的是 test unmatched string 前后不是 {[]} 的所有情形。零宽断言应该是正解。

是该用 零宽断言,但是elisp正则不支持这个。

已解决,是group编号被占用了。。

借用楼主帖子咨询个正则问题。

下面的代码为什么返回”aaa “而不是nil呢,如何修改让它返回nil呢? line中并没有@ group,但却返回了它的子group。

(let ((line "20241222 aaa 10.9"))
  (if (string-match (concat
                     "^"
                     "\\(\\(?10:[0-3]?[0-9]*\\)\s+\\)?"
                     "\\(\\(?13:[\\*!]?\\)\\(?2:[a-zA-z->12]+\\)\\(/\\(?3:[a-zA-z2]+\\)\\)?\s*\\)"
                     "\\(@\\(?11:[a-zA-Z12]+\\)_?\\(?14:[a-zA-Z12]+\\)?\s*\\)?")
                    line)
      (match-string 11 line)))

需要的效果是对 “20241222 aaa 10.9” 返回nil,但对"20241222 aaa 10.9 @bbb"返回bbb。