代码之家  ›  专栏  ›  技术社区  ›  cs95 abhishek58g

Java中多个同时子串替换

  •  11
  • cs95 abhishek58g  · 技术社区  · 8 年前

    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;
    }
    

    列表

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

    text

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

    StringBuilder 文本

    3 回复  |  直到 8 年前
        1
  •  9
  •   Robby Cornelissen    8 年前

    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]
    
        2
  •  3
  •   Oleksandr Pyrohov Andreas    8 年前

    确保所有令牌都按 start

    List<Token> tokens = new ArrayList<>();
    tokens.sort(Comparator.comparing(Token::getStart));
    

    public String replace(String text, List<Token> tokens) {
        StringBuilder sb = new StringBuilder(text);
        for (int i = tokens.size() - 1; i >= 0; i--) {
            Token token = tokens.get(i);
            sb.replace(token.start, token.end + 1, "[" + token.type + "]");
        }
        return sb.toString();
    }
    
        3
  •  1
  •   Coder-Man    8 年前

    提取开始和结束之间的子字符串,并由它拆分。然后你得到一个由2个元素组成的数组,在其中插入你想要的元素。接下来,您必须移动您的下一个字符串,以将ID替换为(替换长度的前一个字符串)和(放置在其位置的字符串)之间的差异。

    public class Main {
    
        public static void main(String... args) {
            String text = "I want to replace AAA and B and scary wombat";
            Token[] tokens = {new Token(18, 21, "TEST"), new Token(26, 27, "TEST"), new Token(32, 44, "TEST")};
            int delta = 0;
            for (Token token : tokens) {
                String splitter = text.substring(token.start + delta, token.end + delta);
                System.out.println("Splitter: " + splitter);
                delta += token.replacement.length() - splitter.length();
                String[] beforeAndAfter = text.split(Pattern.quote(splitter));
                text = beforeAndAfter[0] + token.replacement + 
                        (beforeAndAfter.length == 2 ? beforeAndAfter[1] : ""); // in case where there are no more chars after splitter in text
            }
            System.out.println(text);
        }
    
        static class Token {
            public final int start, end;
            public final String replacement;
    
            public Token(int start, int end, String replacement) {
                this.start = start;
                this.end = end;
                this.replacement = replacement;
            }
        }
    }