正则表达式-满足两个(负)条件的所有逗号

时间:2019-03-02 18:59:19

标签: r regex regex-lookarounds lookaround

这是一个基本问题,因为我对RegEx不太熟悉,但是我无法在线找到答案(可能我不知道要用Google做什么)。

我想编写一个查找所有逗号的函数:

  • 不在“]”和“ [”之间(例如[abc],[def]中)
  • 后跟一个“ +”(例如abc,+ def)

我发现这两个实例的正则表达式是

(?!\\])(\\,)(?!\\s\\[)

(\\,)(?!\\+)

(如果我错了,请纠正我)

但是如何将两者仅用一个命令放在一起,以便我的函数识别出满足这两个条件的所有逗号?我的头有些困难,因为这是两个负面条件。 如果有什么不同,我正在使用R。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以将PCRE regex与基本R regex函数一起使用:

][^[]*\[(*SKIP)(*F)|,(?!\+)

请参见regex demo

详细信息

  • ][^[]*\[(*SKIP)(*F)-匹配并跳过],然后选择0+个除[以外的字符,然后选择[(即 not between a "]" and a " [" 规则)
  • |-或匹配
  • ,(?!\+)-逗号后没有立即出现文字+的逗号

R online demo

x <- "[abc], [def] abc,+def abc,def"
reg <- "][^[]*\\[(*SKIP)(*F)|,(?!\\+)"
strsplit(x, reg, perl=TRUE)
## [[1]]
## [1] "[abc], [def] abc,+def abc" "def"
gsub(reg, "@", x, perl=TRUE)
## [1] "[abc], [def] abc,+def abc@def"

答案 1 :(得分:0)

所以您要使用逗号:

  • 前面没有]
  • 后跟+或[

第二秒,您可以使用负前瞻((?!))。对于第一个,您需要它的反面,即反面((?<!))。

这应该做到:

,(?<!\])(?!\+|\[)