正则表达式 - 多重否定外观

时间:2016-05-10 21:21:50

标签: regex r pcre lookbehind

我正在研究来自写入调查领域的字符串,该字段询问了一个主要的研究领域。

对于“艺术”部分,我希望匹配所有类型的艺术学位,但明确排除文科,烹饪艺术和语言艺术。

此代码正确排除了“文科”,但我无法列出要排除的多项内容。

我在R中使用grel函数和perl兼容的regexp。

field_1_1_arts <-c("\\b(dance|ballet|design|film|(?<!liberal )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b") 

data$field_1_1_arts <- grepl(field_1_1_arts,data$major_fields,ignore.case=TRUE, perl=TRUE)

我试过了:

#this allows both liberal and culinary to pass
field_1_1_arts <-c("\\b(dance|ballet|design|film|(?<!liberal )arts?|(?<!culinary )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b") 

#this gives an invalid expression error
field_1_1_arts <-c("\\b(dance|ballet|design|film|(?<!(liberal|culinary) )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b") 

1 个答案:

答案 0 :(得分:2)

要排除超过libral,只需添加更多负面外观,例如:

"\\b(dance|ballet|design|film|(?<!liberal )(?<!culinary )(?<!language )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b"
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

请参阅regex demo

您还可以使用|

"\\b(dance|ballet|design|film|(?<!liberal |culinary |language )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b"
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

请参阅another demo