首页 > 代码库 > 模拟Excel中SUBSTITUTE函数

模拟Excel中SUBSTITUTE函数

Excel中的SUBSTITUTE是一个很有用的字符串替换函数,其说明如下:

说明

在文本字符串中用 new_text 替换 old_text。 如果需要在某一文本字符串中替换指定的文本,请使用函数 SUBSTITUTE;如果需要在某一文本字符串中替换特定位置处的任意文本,请使用函数 REPLACE。

语法

SUBSTITUTE(text, old_text, new_text, [instance_num])

SUBSTITUTE 函数语法具有下列参数:

  • 文本    必需。 需要替换其中字符的文本,或对含有文本(需要替换其中字符)的单元格的引用。

  • old_text    必需。 需要替换的文本。

  • new_text    必需。 用于替换 old_text 的文本。

  • Instance_num    可选。 指定要用 new_text 替换 old_text 的事件。 如果指定了 instance_num,则只有满足要求的 old_text 被替换。 否则,文本中出现的所有 old_text 都会更改为 new_text。

Java实现:

 1     public static String substitute(String src, String oldText, String newText,
 2             int... instancePositions) {
 3         /*
 4          * 由于直接使用split方法会涉及正则表达式, 但无法确认oldText中是否含有正则表达式的元字符,
 5          * 如:[]^$|等,因此先获取动态的分割符, 将oldText用replace方法(此方法不涉及正则表达式)替换为获取到的分隔符
 6          */
 7         String splitStr = getSplitStr(src);
 8         // System.out.println(splitStr);
 9         String dealSrc =http://www.mamicode.com/ src.replace(oldText, splitStr);
10         // 使用获取到的分隔符分割
11         String[] splitArr = dealSrc.split(splitStr);
12         int arrLen = splitArr.length;
13         StringBuffer sbf = new StringBuffer();
14         for (int i = 0; i < arrLen; i++) {
15             boolean needReplace = needReplace(i, instancePositions);
16             if (needReplace && i != 0) {
17                 sbf.append(newText);
18             } else {
19                 sbf.append(oldText);
20             }
21             sbf.append(splitArr[i]);
22         }
23         return sbf.toString().substring(oldText.length());
24     }
25 
26     private static String getSplitStr(String src) {
27         StringBuilder sbd = new StringBuilder();
28         boolean contains = false;
29         do {
30             sbd.append("@");
31             contains = src.contains(sbd);
32         } while (contains);
33         return sbd.toString();
34     }
35 
36     private static boolean needReplace(int num, int[] nums) {
37         boolean needReplace = false;
38         // 当未输入需要替换的位置时,默认全部替换,因此直接返回true
39         if (nums.length == 0) {
40             return true;
41         }
42         for (int i = 0; i < nums.length; i++) {
43             if (num == nums[i]) {
44                 needReplace = true;
45                 break;
46             }
47         }
48         return needReplace;
49     }
50 
51     public static void main(String[] args) {
52         String s = substitute("yan@@tian@i@love@u", "@@", " ");
53         System.out.println(s);
54     }

 

模拟Excel中SUBSTITUTE函数