正则表达式 - 多个负面回顾

Regex - Multiple Negative Lookbehinds

我正在匹配来自询问主要研究领域的写入调查字段的字符串。

对于 "Arts" 部分,我想匹配所有类型的艺术学位,但明确排除文科、烹饪艺术和语言艺术。

此代码正确排除了 "liberal arts",但我无法列出多个要排除的内容。

我在 R 中使用 grepl 函数和 perl 兼容的正则表达式。

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") 

要排除超过 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