java - Java中的多个同时子字符串替换

标签 java string stringbuilder

(我来自 python 世界,所以如果我使用的一些术语符合规范,我深表歉意。)

我有一个 String 和一个要替换的 List 开始/结束索引。无需太多细节,请考虑以下基本模型:

String text = "my email is foo@bar.com and my number is (213)-XXX-XXXX"
List<Token> findings = SomeModule.someFnc(text);

Token

的定义
class Token {
    int start, end;
    String type;
}

List 表示我要编辑的敏感数据的开始和结束位置。

实际上,API 返回我迭代获取的数据:

[{ "start" : 12, "end" : 22, "type" : "EMAIL_ADDRESS" }, { "start" : 41, "end" : 54, "type" : "PHONE_NUMBER" }]

使用这些数据,我的最终目标是编辑由这些 Token 对象指定的 text 中的标记,以获得:

"my email is [EMAIL_ADDRESS] and my number is [PHONE_NUMBER]"

让这个问题变得重要的是,替换子串的长度并不总是与它们要替换的子串的长度相同。

我目前的行动计划是从 text 构建一个 StringBuilder,按照起始索引的相反顺序对这些 ID 进行排序,然后从缓冲区的右端开始替换.

但有些东西告诉我应该有更好的方法……有吗?

最佳答案

这种方法有效:

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        String text = "my email is foo@bar.com and my number is (213)-XXX-XXXX";

        List<Token> findings = new ArrayList<>();
        findings.add(new Token(12, 22, "EMAIL_ADDRESS"));
        findings.add(new Token(41, 54, "PHONE_NUMBER"));

        System.out.println(replace(text, findings));
    }

    public static String replace(String text, List<Token> findings) {
        int position = 0;
        StringBuilder result = new StringBuilder();

        for (Token finding : findings) {
            result.append(text.substring(position, finding.start));
            result.append('[').append(finding.type).append(']');

            position = finding.end + 1;
        }

        return result.append(text.substring(position)).toString();
    }
}

class Token {
    int start, end;
    String type;

    Token(int start, int end, String type) {
        this.start = start;
        this.end = end;
        this.type = type;
    }
}

输出:

my email is [EMAIL_ADDRESS] and my number is [PHONE_NUMBER]

关于java - Java中的多个同时子字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50921075/

相关文章:

java - glassfish 每小时一次完整GC

java - 使用webHdfs创建文件

java - 我的 2d Android 游戏遇到问题

c - 关于这个问题的快速问题,为什么它不在字符串上打印出第二个值(转换后的第二个值)?

java - 为什么 StringBuffer 类使用 Array 作为其底层数据结构而不是 LinkedList?

c# - 确定我在数组中的位置

java - 如何操作错误代码枚举

java - 在 Java 中替换字符串中特定位置的子字符串

javascript - 如何为 BIRT 中的空单元格指定默认字符串值?

c# - 有很多 if else 条件是个好习惯吗?