Regex 如何匹配具有特定模式的所有行,除非存在特定子字符串?

Regex 如何匹配具有特定模式的所有行,除非存在特定子字符串?,regex,regex-lookarounds,regex-negation,Regex,Regex Lookarounds,Regex Negation,我有多行代码,其格式遵循非常简单的模式:&G3FRM.GetRecord(“.GetField(”).Value。例如,我可能有以下内容: &G3FRM.GetRecord("PAGEREC").GetField("GSHOURS").Value &G3FRM.GetRecord("RSCH_SETUP").GetField("Y_NIH_MNTHLY_CAP").Value &G3FRM.GetRecord("PAYMENT").GetField("Y_HRS_TOTA

我有多行代码,其格式遵循非常简单的模式:
&G3FRM.GetRecord(“.GetField(”).Value
。例如,我可能有以下内容:

&G3FRM.GetRecord("PAGEREC").GetField("GSHOURS").Value
&G3FRM.GetRecord("RSCH_SETUP").GetField("Y_NIH_MNTHLY_CAP").Value
&G3FRM.GetRecord("PAYMENT").GetField("Y_HRS_TOTAL").Value
我需要匹配任何具有
&G3FRM.GetRecord
、没有
PAGEREC
作为第一个字符串/标记的内容,然后是模式的其余部分。这些语句可以出现在任何给定行的开头、中间或结尾,甚至可以在一行中有多个匹配项

这是我尝试过的正则表达式模式:

&G3FRM\.GetRecord\("(?!PAGEREC)"\)\.GetField\("\w+"\)\.Value
据我所知,这是在匹配一些文本(
&G3FRM.GetRecord(
),然后使用负前瞻查找任何与
PAGEREC
不匹配的字符串。它当然排除了任何具有
PAGEREC
的匹配,但也排除了所有其他内容,因此我知道我遗漏了一些内容

所以,我选了一堆线条,看起来像这样:

Local string &rqst_dept_descr = %This.GetDepartmentDescription(&G3FRM.GetRecord("PAGEREC").GetField("GSREQUESTING_DEPT").Value);
Local string &hoursHTML = GetHTMLText(HTML.G_FORM_ROW_VALUE, "Hours", &G3FRM.GetRecord("PAYMENT").GetField("GSHOURS").Value);
Local string &off_cycle_deposit = &G3FRM.GetRecord("PAGEREC").GetField("GSOFFCYCLE_DIR_DEP").Value;
&G3FRM.GetRecord("POSITION").GetField("GSCOMMISSIONTIPS").Value = "Y";
SQLExec(SQL.Y_HAS_CONTRACT_DATA_IN_RANGE, &G3FRM.GetRecord("PAGEREC").GetField("EMPLID").Value, &G3FRM.GetRecord("PAYMENT").GetField("CONTRACT_NUM").Value, &G3FRM.GetRecord("PAYMENT").GetField("EFFDT").Value, &G3FRM.GetRecord("PAYMENT").GetField("EFFDT").Value, &HasContractData);

在这个例子中,它应该排除第一行,因为它只有我不想要的模式。它应该包括第二行,排除第三行,包括第四行,包括第五行(即使它有一个排除模式的示例,但它有我想要的倍数)。

您可以使用这个正则表达式:

&G3FRM\.GetRecord\("(?!PAGEREC\b)\w+"\)\.GetField\("\w+"\)\.Value
请注意,在负前瞻之后使用
\w+
,以允许它匹配一个不能是
PAGEREC1
的单词。我已在您的前瞻条件中添加了
\b
,以确保我们不匹配部分单词

在regex
&G3FRM\.GetRecord\(“(?!PAGEREC)”)\.GetField\(“\w+”)\.Value
中,您的负先行条件是正确的,但regex在两个双引号之间不匹配任何内容,因此您的regex将只匹配例如
&G3FRM.GetRecord(“”).GetField(“GSHOURS”)。Value

使用
&G3FRM\.GetRecord\(“(?!PAGEREC”)[“+”)\.GetField\(“\w+”\)\.Value