java - 在大约 100 个字符和下一个符号后分割字符串 (Java)

标签 java regex string split

我想在大约之后分割一个字符串。 200 个字符或下一个特殊符号:

该字符串的格式类似于 <data>|...|<data>| ,其中一<data> block 的长度在 30 到 70 个字符之间。

我想要的结果是一个像这样的字符串数组

<data>|<data>|
<data>|
<data>|<data>|<data>|

每行大约 200 个字符长。

我的代码看起来像

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

public class RegexpTest {

@Test
public void testRegexp() throws Exception {
    String data = "Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|";
    String pat = ".{1,200}(\\d|\\s|\\w|\\.|\\:{1,70})\\|";
    String ans = data.replaceAll(pat, "X");
    //Pattern regex = Pattern.compile(pat);
    //Matcher regexMatcher = regex.matcher(str);

    System.out.println(data.length()); //prints 528
    System.out.println(ans.length()); //prints 3
}
}

结果产生正确数量的替换 (3),但总体结果应该是一个字符串数组。

是否有一个正则表达式(类似于 SO Q&A )可以解决这个问题?使用 for 循环的解决方案也是可以接受的。

便签本:

请随意测试regex101.com (包括我的尝试和测试数据)

最佳答案

没有正则表达式。只需在“|”处分割数据即可。然后检查向现有行添加部分是否会超过 200 个字符。如果是,则开始一个新行。快速而肮脏:

编辑:添加注释和格式

public static void main(String[] args) {
    // your data
    String data = "Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|Symbol Ticker:1466654463000:157.71:TRADE:42|";
    // do the split
    List<String> out = new Test().splitToApproxAt(data, 200);
    // print the splitted lines
    for(String o : out){
        System.out.println(o);
    }
}

public List<String> splitToApproxAt(String data, int len){
    // split at the pipe symbol "|"
    String[] parts = data.split("\\|");

    // this will be our current line in progress
    String line = "";

    // this will store the lines up to 200 chars
    List<String> out = new ArrayList<String>();

    // for every data-part
    for( String part : parts ){
        if(part.length() > len){
            System.out.println("oh shit, what do?");
            continue;
        }
        // would this exceed the 200 chars?
        if( line.length() + part.length() > len){
            // yes! add previous line to output
            // and start a new one.
            out.add(line);
            line = part;
        }else{
            // no we can attach that to the
            // current line
            if(line.length()>0){
                // delimit with pipe
                line += "|" +part;
            }else{
                // line was empty, no pipe
                line = part;
            }
        }
    }
    // add the last line to the output
    out.add(line);
    return out;
}

关于java - 在大约 100 个字符和下一个符号后分割字符串 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37988662/

相关文章:

java - Zip4J -> java.security.ProviderException : Could not construct MacSpi instance

string - Haskell 将字符串转换为整数列表

Java - 值意外重置为 0

java - Resteasy 客户端抛出异常

尝试匹配 URL 的 JavaScript 正则表达式语法错误会导致意外标记 ^

java - 什么是 Pattern.quote() 的 Java 1.4.2 等价物

mysql - 如果结果以特定字符结尾,则将字符 append 到结果末尾

string - 我们如何将文档插入到 Elastic Search 中?‽‽?

java - JLabel 在其上覆盖矩形时会失去对齐(又名时髦)

c++ <regex> 搜索不匹配