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

时间:2019-09-16 19:21:52

标签: regex regex-lookarounds regex-negation

我有多行代码,其代码格式遵循非常简单的模式:&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作为第一个字符串/标签的内容,然后匹配其余的模式。这些语句可以出现在任何给定行的开头,中间或结尾,甚至在一行中可能有多个匹配项。

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

&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 第三行,包括第四行,并包括第五行(即使它确实有一个排除模式的例子,但它有多个我想要)。

1 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

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

请注意在否定超前使用\w+,以使其与不能为PAGEREC1的单词匹配。我已在您的超前条件中添加了\b,以确保我们不匹配部分单词。

RegEx Demo

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