根据条件拆分字符串

时间:2017-05-07 03:57:58

标签: javascript regex

我想将电子表格单元格引用(例如A10AB100ABC5)拆分为两个字符串部分:列引用和行引用。

A10 => A10
AB100 => AB100 ...

是否有人知道如何通过字符串函数执行此操作?

2 个答案:

答案 0 :(得分: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
&#13;
&#13;
&#13;

答案 1 :(得分: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]找到它们。

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

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