我如何让这个正则表达式模仿后视?

时间:2014-04-14 21:04:25

标签: javascript regex

/(([$]*)([A-Z]{1,3})([$]*)([0-9]{1,5}))/gi

Regular expression visualization

Regex running on Debuggex

这是为了从电子表格公式中提取单元格引用并检查公式是否包含绝对引用。问题是它匹配一个无效的单元格,最后一个在这里:

a1
$a1
$A$5
A5*4
A20+45
A34/A$23
A1*6
A1*A45
$AAA11
AAA33
AA33:A33
$AAAAA44 // <-- not a valid cell! 

它与$ AAAAA44中的AAA44相匹配,但它不应该。所有其他捕获组等都正常工作 - 每一行但最后一行正确地抓取一个或多个单元格引用。一个消极的前瞻似乎是正确的方式,但在长时间使用它之后,我必须承认被卡住了。

1 个答案:

答案 0 :(得分:1)

如果您无法匹配^...$,那么您仍然可以引入一些\b匹配

/foo\bbar/.test('foobar'); // false
/foo\b\d/.test('foo1');    // false
/foo\b.\d/.test('foo+1');  // true

所以你的 RegExp 会是这样的(我留在你的捕获组中)

var re = /(?:\b|^)((\$?)([a-z]{1,3})(\$?)(\d{1,5}))(?:\b|$)/i;
re.test('$AAAAA44'); // false
re.test('$AAA44'); // true

debuggex
Demo