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

How can I match all lines with a certain pattern, except when a certain substring is present?

我有多行有一些代码,其格式遵循一个非常简单的模式:&G3FRM.GetRecord("<TAG>".GetField("<TAG>").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 作为第一个 string/tag,然后是其余模式的任何东西。这些语句可以出现在任何给定行的开头、中间或结尾,甚至可以在一行中出现多个匹配项。

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

&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);

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

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

&G3FRM\.GetRecord\("(?!PAGEREC\b)\w+"\)\.GetField\("\w+"\)\.Value

注意在否定先行后使用 \w+ 以允许它匹配不能是 PAGEREC1 的单词。我在您的前瞻条件中添加了 \b 以确保我们不匹配部分单词。

RegEx Demo

在您的正则表达式中 &G3FRM\.GetRecord\("(?!PAGEREC)"\)\.GetField\("\w+"\)\.Value 您的否定先行条​​件是正确的,但正则表达式不匹配 2 个双引号之间的任何内容,因此您的正则表达式将仅匹配例如&G3FRM.GetRecord("").GetField("GSHOURS").Value.