IMCA1024
V2EX  ›  问与答

Java , 想请教有没什么方法能对这种字符串转换有高效操作

  •  
  •   IMCA1024 · Nov 27, 2020 · 2008 views
    This topic created in 1992 days ago, the information mentioned may be changed or developed.

    现在有一段类似这样的格式 String

    [0:1.520,0:2.460,0]  喂,你好。
    [0:4.300,0:7.920,0]  xxxxxxxx
    [0:8.750,0:10.440,0]  xxxxxxxx
    [0:10.690,0:16.460,0] xxxxxxxxxx 。
    
    

    []里面的 第一位是开始时间戳,第二位是结束时间戳,第三位是角色标识。 后面跟着的是文本内容

    要转换成这种:

    [
    {"begin":1000,"end":2000,"role":"角色 1","words":"  xxxx"},
    {"begin":4000,"end":6000,"role":"角色 1","words":"  xxxxx 。"},
    {"begin":8000,"end":9000,"role":"角色 2","words":"  xxxxxx 。"},
    {"begin":12000,"end":13000,"role":"角色 2","words":"  xxxxxx"},
    ]
    
    

    目前我是非常低效的做法: 先根据换行符 spilit("\n");切割出每一行

    比如一行: [0:1.520,0:2.460,0] 喂,你好

    然后 splitResult[0] 就是 整个[0:1.520,0:2.460,0] 内容 ,splitResult[1]就是文本内容 再对 splitResult[0] 进行处理, subString 出 0:1.520,0:2.460,0 然后再用 split(",")切割出 时间戳 以及 角色标识。

    有没什么其他高效方法,对字符串操作不太熟悉

    6 replies    2020-11-27 13:22:57 +08:00
    auin
        1
    auin  
       Nov 27, 2020
    “高效“的做法就是把你的这段处理过程写成工具类,然后:
    String json = Util.parse(text).toJSON();
    完美!
    正经来说,查看下你的这段 Text 是否是某种标准协议的报文,一般都有 Java 解析库的,如果不是标准的那么你自己实现也是 OK 的,主要关注下有没有边界情况和异常情况导致 BUG ;
    msg7086
        2
    msg7086  
       Nov 27, 2020
    可以用正则,但是处理是少不了的。能做的就是让代码尽可能清晰,方便维护。
    IMCA1024
        3
    IMCA1024  
    OP
       Nov 27, 2020
    @liuxey
    目前边界情况异常情况 代码里都有处理,我就是觉得这种方法处理起来效率好像挺低的
    songzblin
        4
    songzblin  
       Nov 27, 2020   ❤️ 1
    利用了正则表达式,希望有帮助
    String sourceInfo = "[0:1.520,0:2.460,0] 喂,你好。";
    String TimeRegex = "\\d+:\\d+.\\d+";
    Pattern pattern = Pattern.compile(TimeRegex);
    Matcher matcher = pattern.matcher(sourceInfo);
    while (matcher.find()) {
    // 两个时间
    System.out.println(matcher.group());
    }
    String roleRegex = ",\\d+]";
    pattern = Pattern.compile(roleRegex);
    matcher = pattern.matcher(sourceInfo);
    while (matcher.find()) {
    // 身份
    System.out.println(matcher.group().replaceAll(",|]", ""));
    }
    String infoRegex = "] .*";
    pattern = Pattern.compile(infoRegex);
    matcher = pattern.matcher(sourceInfo);
    while (matcher.find()) {
    // 信息
    System.out.println(matcher.group().replaceAll("] ",""));
    }
    yunyi93
        5
    yunyi93  
       Nov 27, 2020
    一般情况,JSON 映射就可以了
    tairan2006
        6
    tairan2006  
       Nov 27, 2020
    老实讲,正则说不定还没 split 快…你要自己测一下
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3333 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 13:12 · PVG 21:12 · LAX 06:12 · JFK 09:12
    ♥ Do have faith in what you're doing.