我正在尝试制作一个正则表达式,该正则表达式仅匹配 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-99
或 100
交替处理,其中 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/