regex 如何对下面的正则表达式求反?

7kqas0il  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(145)

我使用这个regex:

\([^)]+\d{4}\)

匹配科学引文(它们在括号中,以年份结尾):

Text text text (Hung et al., 2020; Sung et al., 2021) text text

现在我想匹配所有不是科学引文的内容(在本例中是Text text texttext text)。我尝试使用负前瞻:

(?!\([^)]+\d{4}\))

但是当我试着什么都不用来替换火柴的时候,什么都不用来替换。
可能是什么问题以及如何解决它?
Regex101

c3frrgcw

c3frrgcw1#

根据正则表达式的风格,您可以使用捕获组:

\([^)]+\d{4}\)|(\S.*?)(?=\s*(?:\([^)]+\d{4}\)|$))

说明

  • \([^)]+\d{4}\)符合科学模式
  • |
  • (\S.*?)捕获组1,以非空白字符开始,匹配0+字符,尽可能少
  • (?=\s*(?:\([^)]+\d{4}\)|$))正向先行,直接在右侧Assert科学模式,或者在字符串末尾后跟可选的空格字符

Regex demo
或者使用PCRE使用SKIP FAIL方法:

\([^)]+\d{4}\)(*SKIP)(*FAIL)|\S.*?(?=\s*(?:\([^)]+\d{4}\)|$))

Regex demo

14ifxucb

14ifxucb2#

PCRE2:

\([^)]+\d{4}\)         # Match a scientific citation
|                      # or
(?<=^|\s)              # something preceded by the beginning of the line or a whitespace
(?:                    # that consists of
  .(?!\([^)]+\d{4}\))  #             characters not followed by a scientific citation.
)+                     # one or more

这个解决方案捕获了想要的和不想要的结果,因此你需要使用编程语言来过滤它们。
试试on regex101.com

相关问题