Regex sas中的正则表达式,在匹配词后不匹配词

Regex sas中的正则表达式,在匹配词后不匹配词,regex,sas,Regex,Sas,也许这很容易,但我找不到解决办法 我在使用perl正则表达式的Sas 9.3中工作。 我正在搜索一个正则表达式,它只匹配某些单词,而后面没有特定的其他单词。例如,它应该匹配您有“汽车”的所有文本,并且在此之后的所有其他文本中不应该有“不是”。(可以忽略大小写,因为我对代码中的所有内容都加了大小写) 应该匹配 这不是我想要的车 这辆车是绿色的 不应该匹配 这辆车不是绿色的 这是我想要的车,但没有 一种解决方案是将其分为两个匹配项: prxmatch(“/The car/”,mytext)>0和pr

也许这很容易,但我找不到解决办法

我在使用perl正则表达式的Sas 9.3中工作。 我正在搜索一个正则表达式,它只匹配某些单词,而后面没有特定的其他单词。例如,它应该匹配您有“汽车”的所有文本,并且在此之后的所有其他文本中不应该有“不是”。(可以忽略大小写,因为我对代码中的所有内容都加了大小写)

应该匹配

这不是我想要的车

这辆车是绿色的

不应该匹配

这辆车不是绿色的

这是我想要的车,但没有

一种解决方案是将其分为两个匹配项:

prxmatch(“/The car/”,mytext)>0和prxmatch(/The car.+not/”,mytext)=0

但是我必须多次使用该逻辑,在更复杂的情况下也是如此,所以我不想总是使用2个prxmatch,而是将逻辑组合到一个prxmatch中

我读了很多关于look aheads的书,并尝试了一些例子,但它们并不正确,例如:

"/The Car.+[^(not)]/"

第一个和第二个返回所有4个文本作为结果,第三个则根本没有结果

有人能为我提供一个解决方案吗?一个单词的简单not运算符,或者一个正确的向前看/向后看方法

(?im)^.*\bthe car\b(?!.*\bnot\b).*

模式分解:

  • (?im)
    -启用不区分大小写和多行匹配模式
  • ^
    -行的开头(因为使用了
    (?m)
  • *
    -匹配0+除换行符以外的任何字符
  • \b汽车\b
    -2个完整的单词“汽车”(由2个单词组成的序列)
  • (?!.\bnot\b)
    -如果在
    汽车的右侧某处有一个完整的单词“not”,则会导致匹配失败的负面前瞻
  • *
    -换行符或字符串结尾前的行的其余部分

你喜欢什么?或者@Wiktor Stribiżew:(?)im做什么?您的第一个示例返回一个错误,您的第二个示例似乎有效,但前提是我在开始时添加(?im)。到目前为止,谢谢你,但也许你可以解释一下这到底是怎么工作的。你有多行字符串输入吗?如果是,那么我理解了
(?m)
工作的原因
(?i)
是一个不区分大小写的修饰符,
(?m)
是一个多行修饰符,使
^
在一行的开头而不是整个字符串的开头匹配。所以,
“/^.*\b这辆车应该能用。如果是,我将发布。@Wiktor Stribiżew:K,我可以删除I,它仍然与(?m)一起工作。我有一个来自数据库的textfield,它由一些客户填写,比我的示例中的文本复杂得多。所以我猜文本是多行的,尽管它在我的sas结果视图中显示为单行文本。但非常感谢,如果你把第二个例子作为答案,我会接受的。因此,m是问题所在,因为选项在最后一个regex分隔符后面-So
prxparse('//ios)例如
i
=不敏感,
o
=编译一次,我忘了S做了什么。我试图尽可能简化您的解决方案,“/the CAR(?)。+NOT)/”也适用于特定的示例,尽管您的解决方案对于更复杂的构造更为安全……如果您不需要完整的行匹配,当然,使用
\b汽车
(或不区分大小写的版本
(?i)\b汽车
"/^(?!.*not.*).*?The car.*$/"
(?im)^.*\bthe car\b(?!.*\bnot\b).*