我有多行代码,其代码格式遵循非常简单的模式:&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 第三行,包括第四行,并包括第五行(即使它确实有一个排除模式的例子,但它有多个我想要)。
答案 0 :(得分:2)
您可以使用此正则表达式:
&G3FRM\.GetRecord\("(?!PAGEREC\b)\w+"\)\.GetField\("\w+"\)\.Value
请注意在否定超前使用\w+
,以使其与不能为PAGEREC1
的单词匹配。我已在您的超前条件中添加了\b
,以确保我们不匹配部分单词。
在您的正则表达式&G3FRM\.GetRecord\("(?!PAGEREC)"\)\.GetField\("\w+"\)\.Value
中,您的否定超前条件是正确的,但正则表达式在两个双引号之间不匹配任何内容,因此您的正则表达式将仅匹配例如&G3FRM.GetRecord("").GetField("GSHOURS").Value
。