javascript - 匹配类似 Excel 的引用单元格的正则表达式

标签 javascript regex

我正在尝试制作一个正则表达式,该正则表达式仅匹配 A-Z(含)范围内的字母,后跟 0-100(含)之间的数字。如果我的正则表达式之前有任何数字,我不希望它匹配。例如:5A1 不应匹配,因为它前面有数字 5,即使 A1 在字符串中也是如此。同样,我不希望它匹配该范围之后的任何数值,例如 A10000(不应匹配,因为 1000 在 100 之外)。

下面演示了我要匹配的内容:

A34A1                // no match
5A1                  // no match
2.344A1              // no match
A1001                // no match
A1                   // match A1
A10                  // match A10
A100                 // match A100
SUM(A1:A2)           // match A1 and A2
SUM(A1:A2, 5A1, A3)  // match A1,A2, A3

我一直在尝试这些正则表达式,但不确定如何排除该范围之前或之后的任何数字:

/[A-Z]{1,2}[1-9]{0,3}/g

/([^0-9])[A-Z]{1,2}[0-9]{1,3}/g

最佳答案

使用这个正则表达式:

/\b[A-Z]([0-9]{1,2}|100)\b/

或更简单的等价物:

/\b[A-Z]([0-9][0-9]?|100)\b/

或等效的更短数字元字符:

/\b[A-Z](\d\d?|100)\b/

在正则表达式的开头和结尾使用 \b 元字符,您可以消除任何不需要的前面或结尾字符。 [A-Z] 字符类仅包含一个大写字母来开始单元格引用。数字部分由 0-99100 交替处理,其中 0-99 部分由一到两位数字字符处理类。代替显式 [0-9] 字符类,\d 元字符也可以正常工作,如果这是您的偏好的话。

这是一个示例 Ruby 程序(类似于 Javascript 的正则表达式风格)以显示其工作情况:

data = [
  [ "A34A1",   false ],
  [ "5A1",     false ],
  [ "2.344A1", false ],
  [ "A1001",   false ],
  [ "A1",      true ],
  [ "A10",     true ],
  [ "A100",    true ],
  [ "SUM(A1:A2)", true ],
  [ "SUM(A1:A2, 5A1, A3)", true ]
]

data.each do |pair|
  puts "#{pair[1] == !(pair[0] =~ /\b[A-Z]([0-9]{1,2}|100)\b/).nil? ? 'Pass' : 'Fail'}: '#{pair[0]}'"
end

data数组中,每一对的第二个元素是一个 bool 值,它决定了测试单元格引用是否应该匹配。

运行这个程序的输出显示所有测试都通过了:

> ruby regex_test.rb
Pass: 'A34A1'
Pass: '5A1'
Pass: '2.344A1'
Pass: 'A1001'
Pass: 'A1'
Pass: 'A10'
Pass: 'A100'
Pass: 'SUM(A1:A2)'
Pass: 'SUM(A1:A2, 5A1, A3)'

关于javascript - 匹配类似 Excel 的引用单元格的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37128114/

相关文章:

javascript - 如何使用 promises 对对象数组的每个元素进行 ajax 调用?

javascript - 为什么不能提交未呈现的表单?

javascript - 函数中的reduce()计算产品总数

Javascript 二十一点牌组创建

正则表达式和非技术用户

java - 请您解释一下这个正则表达式(替换字符串中的特殊字符)?

c# - 正则表达式匹配以句点开头并以下划线结尾的单词?

Javascript:检查字符串是否仅包含字母、数字、空格和特定符号

regex - Django 字段正则表达式验证

正则表达式问题 : Match sequence only n times on a random place