2017-05-07 131 views
-2

我想将电子表格单元格引用(例如,A10AB100,ABC5)拆分为两个字符串部分:列引用和行引用。根据条件拆分字符串

A10 =>A10
AB100 =>AB100 ...

有谁知道如何通过字符串函数来做到这一点?

+0

在这种情况下,您不能拆分,而是使用正则表达式来提取这些令牌。 – Dummy

+1

'/(\ D +)(\ d +)/' - http://www.regular-expressions.info – deceze

回答

0

这是最简单的一个regular expression(正则表达式)做。例如:

var ref = "AA100"; 
var matches = ref.match(/^([a-zA-Z]+)([1-9][0-9]*)$/); 
if (matches) { 
    var column = matches[1]; 
    var row = Number(matches[2]); 
    console.log(column); // "AA" 
    console.log(row); // 100 
} else { 
    throw new Error('invalid ref "' + ref + '"'); 
} 

这里的重要部分是正则表达式字面值/^([a-zA-Z]+)([1-9][0-9]*)$/。我会带你穿过它。

  • ^将正则表达式锚定到字符串的开头。否则,你可能会匹配“123ABC456”之类的东西。
  • [a-zA-Z]+匹配来自a-z或A-Z的一个或多个字符。
  • [1-9][0-9]*只与1-9中的一个字符匹配,然后从0-9中的零个或多个字符。这确保你匹配的号码永远不会从零开始(即不允许“A001”)。
  • $将正则表达式锚定到字符串末尾,以便您不匹配“ABC123DEF”之类的内容。
  • 围绕([a-zA-Z]+)([1-9][0-9]*)的括号会“捕捉”其中的字符串,以便我们稍后可以使用matches[1]matches[2]找到它们。

此示例严格限制匹配有效的单元格引用。如果您信任您收到的数据始终有效,那么您可以使用较不严格的正则表达式,但最好始终验证您的数据,以防数据源更改或您在其他地方使用代码。

如果您收到无效数据,您也可以自行决定要执行的操作。在这个例子中,我让脚本引发错误,但在您的情况下可能会有更好的选择(例如,提示用户输入另一个值)。

1

var res = "AA123"; 
 

 
//Method 1 
 
var arr = res.match(/[a-z]+|[^a-z]+/gi); 
 
document.write(arr[0] + "<br>" + arr[1]); 
 

 
//Method 2 (as deceze suggested) 
 
var arr = res.match(/([^\d]+)(\d+)/); 
 
document.write("<br>" + arr[1] + "<br>" + arr[2]); 
 

 
//Note here [^\d] is the same as \D