我使用这个regex:
\([^)]+\d{4}\)
匹配科学引文(它们在括号中,以年份结尾):
Text text text (Hung et al., 2020; Sung et al., 2021) text text
现在我想匹配所有不是科学引文的内容(在本例中是Text text text和text text)。我尝试使用负前瞻:
Text text text
text text
(?!\([^)]+\d{4}\))
但是当我试着什么都不用来替换火柴的时候,什么都不用来替换。可能是什么问题以及如何解决它?Regex101
c3frrgcw1#
根据正则表达式的风格,您可以使用捕获组:
\([^)]+\d{4}\)|(\S.*?)(?=\s*(?:\([^)]+\d{4}\)|$))
说明
|
(\S.*?)
(?=\s*(?:\([^)]+\d{4}\)|$))
Regex demo或者使用PCRE使用SKIP FAIL方法:
\([^)]+\d{4}\)(*SKIP)(*FAIL)|\S.*?(?=\s*(?:\([^)]+\d{4}\)|$))
Regex demo
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。
2条答案
按热度按时间c3frrgcw1#
根据正则表达式的风格,您可以使用捕获组:
说明
\([^)]+\d{4}\)
符合科学模式|
或(\S.*?)
捕获组1,以非空白字符开始,匹配0+字符,尽可能少(?=\s*(?:\([^)]+\d{4}\)|$))
正向先行,直接在右侧Assert科学模式,或者在字符串末尾后跟可选的空格字符Regex demo
或者使用PCRE使用SKIP FAIL方法:
Regex demo
14ifxucb2#
PCRE2:
这个解决方案捕获了想要的和不想要的结果,因此你需要使用编程语言来过滤它们。
试试on regex101.com。