Javascript正则表达式:要排除所有大写中的虚词吗

Javascript正则表达式:要排除所有大写中的虚词吗,javascript,regex,Javascript,Regex,我有下面的正则表达式来解析google脚本公式,以获得先例 ([A-z]{2,}!)?:?\$?[A-Z]\$?[A-Z]?(\$?[1-9]\$?[0-9]?)? 我需要使数字成为可选的,以适应整个列的范围-参见图。因为数字是可选的,所以我还匹配了我想要排除的函数项-所有大写单词。我想我可以在事后这样做,但我想修改正则表达式以排除它们。我该怎么做 例如: =IFERROR(VLOOKUP($AA16,Account_List_S!$AA:$AC,3,0),0) IFERROR(IF(AD3=

我有下面的正则表达式来解析google脚本公式,以获得先例

([A-z]{2,}!)?:?\$?[A-Z]\$?[A-Z]?(\$?[1-9]\$?[0-9]?)?
我需要使数字成为可选的,以适应整个列的范围-参见图。因为数字是可选的,所以我还匹配了我想要排除的函数项-所有大写单词。我想我可以在事后这样做,但我想修改正则表达式以排除它们。我该怎么做

例如:

=IFERROR(VLOOKUP($AA16,Account_List_S!$AA:$AC,3,0),0)
IFERROR(IF(AD3=1,INDEX(CapEx!$AB$15:$AE$15,1,YEAR(AD$13)-
YEAR($Z$13)-1)*IF(Import_CapEx!AD$15>=0,Import_CapEx!AD$15,0),0),0)";
我要匹配的单词是指在行或列标识符之前具有可选工作表名称和可选
$
的单元格。它们可以是范围或单个单元格

我想匹配的单词示例:

$AA16
$AB$15
AD$15
$Z$13
Account_List_S!$AA:$AC
CapEx!$AB$15:$AE$15
Import_CapEx!AD$15
我想排除的词是函数:

IFERROR
VLOOKUP
IF
YEAR    

第一个镜头:过滤掉完整的大写单词

这个答案还不完美,但在表达式开头使用否定的前瞻性可以让您过滤掉
IF
和任何3+大写字母序列:

(?!\b[A-Z]{3,}\b|\bIF\b)(\b[A-z]{2,}!)?:?\$?\b[A-Z]\$?[A-Z]?(\$?[1-9]\$?[0-9]?)?\b
有几个地方的
\b
是为了确保正负匹配从字母序列的开头一直到结尾

剩下的问题是它与
帐户列表匹配$AA:$AC
在两个匹配中,
帐户列表$AA
:$AC
。所以

第二个镜头:修复正则表达式的正匹配部分

下面是一个更复杂的版本,它与范围正确匹配:

编辑:修复处理OP在评论中给出的示例

(?!\b[A-Z]{3,}\b|\bIF\b)(\b[A-z]{2,}!)?\$?\b[A-Z]{1,3}(\$?[1-9]{1,3})?(:\$?[A-Z]{1,3}(\$?\d{1,3})?)?\b
(?!\b[A-Z]{3,}\b|\bIF\b)(\b[A-z]{2,}!)?(:?\$?\b[A-Z]{1,3}(\$?\d{1,3})?){1,2}\b
在这个版本中,
Account\u List\S$AA:$AC
作为一个整体进行匹配,我相信您希望如此,
Calc\u Named\u HC!AE$32:AE$103
添加在下面的评论中

第三个镜头:接受一些虚假模式,但更容易阅读

如果您愿意在第一个地址之前匹配多余的
,则此更简单的表达式适用:

编辑:修复处理注释中给出的示例

(?!\b[A-Z]{3,}\b|\bIF\b)(\b[A-z]{2,}!)?\$?\b[A-Z]{1,3}(\$?[1-9]{1,3})?(:\$?[A-Z]{1,3}(\$?\d{1,3})?)?\b
(?!\b[A-Z]{3,}\b|\bIF\b)(\b[A-z]{2,}!)?(:?\$?\b[A-Z]{1,3}(\$?\d{1,3})?){1,2}\b
请注意,我保持了您的
[A-z]
范围不变,但@sp00m在其评论中指出,
[A-Za-z_]
可能更合适。

试试这个正则表达式:

/[\(,+\-\*/><=]((\w+!)?\$?[A-Z]{1,2}(\$?[\d]{0,3})?(:\$?[A-Z]{1,2}(\$?\d{0,3})?)?(?=[\),+\-\*/><=]))/g

对于正则表达式来说,这感觉不太合适,但我不能放弃一个好的正则表达式挑战

我的解决方案涉及很多条件检查

(\w+\!)?\$?[A-Z]{1,}(?::\d+)(\:?\$\w+*(?!\()\b

细分

(
  \w+\!        Words followed by an !
)?             which might exist.
\$?            A $ which might exist
[A-Z]{1,}      At least 1 capitalized letter maybe more
(?:                 
   \d+         A non capturing group of digits after our letters
)?             but they might not exist

(
  \:?          A : which might exist
  \$\w+        A $ followed by characters
)*             With none or many of them

(?!\()         All of this, ONLY IF we DONT have a ( after it
\b             All of this, ONLY IF we have a word break
魔术真的发生在有条件的休息结束时,如果没有它们,你会捕获很多其他的东西


样本

let text=`=IFERROR(VLOOKUP($AA165,账户列表)$AA:$AC,3,0),0)
IFERROR(如果AD3=1,指数(资本支出)$AB$15:$AE$15,1,年(AD13)-
年度($Z$13)-1)*如果(进口资本支出!AD$15>=0,进口资本支出!AD$15,0),0)`
设exp=/(\w+\!)?\$?[A-Z]{1,}(?::\d+)(\:?\$\w+*(?!\()\b/gm)
让我们比赛;
而((match=exp.exec(text))){
console.log(匹配[0]);

}
当前面有
$
而后面没有数字时,您是否只想匹配两个大写字母?作为旁注,您可能会认为
[a-z]
的行为与
[a-Za-z]
相同,但实际上不匹配,因为前者匹配其他字符:
[\]^_
加上反勾号。请参阅和。谢谢提问。我需要处理这两种情况。$是可选的。您是否可以更明确地说明所需的输出?您是否还希望匹配,例如,
$AB$15
AD$15
?您没有说什么是“先例”或“整个列的范围”。“不清楚您要匹配的是什么,您只是给出了图像随机部分的示例,而没有解释您要查找的内容。谢谢。这几乎对我有用,但它包含了一些不需要的字符,例如和(您需要使用匹配数组中的第二个元素,即匹配[1],而不是匹配[0])。请参阅演示示例。无论匹配[0]还是匹配[1]都无法处理此文本这是我的google应用程序脚本代码
函数testB(){var thisFormula=“Calc_Named_HC!AE$32:AE$103);“GetPreventSB(thisFormula);}函数GetPreventSB(largeFormula){Logger.clear();var text=largeFormula;Logger.log(text);Logger.log(******************************************************************************************************************************************************************************************************************************************************************************************************;风险交易交易公司;风险交易公司;风险管理公司;风险交易公司;风险交易公司;风险交易公司;风险公司;风险交易公司;风险公司;风险交易公司;交易公司;风险公司;风险公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易公司;交易;交易;不知道如何格式化代码更好的输入不被处理(末尾的减号导致问题
Calc_Named_HC!AE$32:AE$103)-
我相信问题是因为我原来的正则表达式只指定了2位数字,因为我没想到你会有这么大的电子表格,但我猜我错了。我现在将其增加到3位,以容纳上面的103 in:AE$103。如果仍然不起作用,请显示完整字符串,其中
Calc_Named_HC!AE$32:AE$103)-
已找到,因此我可以查看上下文。@ug\u我说得太早了。使用
$X74的文本,Calc\u命名为\u HC!AE$32:AE$103)-Calc\u General\u HC!AE74”
名为_HC!AE$32:AE$103的
Calc_不是作为一个术语提取的,它是被拆分的。对表达式进行简单的更改可以使其工作,但实际上您的示例没有包括这一点,并且您没有多少特定的模式来匹配。这不是结尾处的负数,而是
$
可能会或可能不会持续前variable@ug_如果最后一个美元存在
Calc\u Named\u HC!AE$32:$AE$103
则有效,但如果最后一个美元不存在
Calc\u Named\u HC!AE$32:AE$103
则无效。我使用的表达式是“/(\w+\!)?\$?[A-Z]{1,}(?:::(\:$?\w+)*(!);\b/gm;`看起来您的正则表达式中的最后一个$不是可选的。我在$后面加了一个?但这并没有解决问题issue@StevenGreenbaum这不是我文章中的正则表达式。我没有结尾的
,而且你评论中的那一个也不太清楚