Java 有没有办法将csv字符串拆分为40个字符,并用正则表达式删除最后一个逗号之后的任何内容?

Java 有没有办法将csv字符串拆分为40个字符,并用正则表达式删除最后一个逗号之后的任何内容?,java,regex,Java,Regex,在java项目中,存储逗号分隔值字符串的限制为40个字符。我们只需要显示尽可能多的值,因为对于一个报表来说,当值超过40个字符时,显示所有值并不重要。正则表达式是否可以在删除最后一个逗号中的字符时将字符串限制为40个字符 目前代码看起来像这样 String csv = "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000"; String csvSub40 = csv.substring(0, 40); St

在java项目中,存储逗号分隔值字符串的限制为40个字符。我们只需要显示尽可能多的值,因为对于一个报表来说,当值超过40个字符时,显示所有值并不重要。正则表达式是否可以在删除最后一个逗号中的字符时将字符串限制为40个字符

目前代码看起来像这样

String csv = "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000";
String csvSub40 = csv.substring(0, 40);
String csvSub40LastComma = csvSub40.substring(0, csv.lastIndexOf(","));
//output is 11111,22222,33333,44444,55555,66666 as expected
我在正则表达式中尝试了一些方法,但不知道如何在不破坏字符串短于40个字符的情况下强制它查找最后一个逗号

5/13测试通过:

^(.{1,40})
9/13测试通过(反向):

我这里有一个带有测试的regex101示例:

编辑:为了澄清那些没有查看regex101测试用例的人,这里是所有的测试用例

"11111" -> "11111"
"11111   " -> "11111"
"11111," -> "11111"
"11111,   " -> "11111"
"11111,22222,33333,44444,55555" -> "11111,22222,33333,44444,55555"
"11111,22222,33333,44444,55555   " -> "11111,22222,33333,44444,55555"
"11111,22222,33333,44444,55555," -> "11111,22222,33333,44444,55555"
"11111,22222,33333,44444,55555,   " -> "11111,22222,33333,44444,55555"
"11111,22222,33333,44444,55555,66666" -> "11111,22222,33333,44444,55555,66666"
"11111,22222,33333,44444,55555,66666   " -> "11111,22222,33333,44444,55555,66666"
"11111,22222,33333,44444,55555,66666," -> "11111,22222,33333,44444,55555,66666"
"11111,22222,33333,44444,55555,66666,   " -> "11111,22222,33333,44444,55555,66666"
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000" -> "11111,22222,33333,44444,55555,66666"
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000   " -> "11111,22222,33333,44444,55555,66666"
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000," -> "11111,22222,33333,44444,55555,66666"
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,   " -> "11111,22222,33333,44444,55555,66666"

这应涵盖所有测试。正则表达式几乎不需要任何帮助(来自另一个正则表达式)来修剪行尾空格和悬空逗号

 String[] tests = {
                "11111", "11111",
                "11111   ", "11111",
                "11111,", "11111",
                "11111,   ", "11111",
                "11111,22222,33333,44444,55555", "11111,22222,33333,44444,55555",
                "11111,22222,33333,44444,55555   ", "11111,22222,33333,44444,55555",
                "11111,22222,33333,44444,55555,", "11111,22222,33333,44444,55555",
                "11111,22222,33333,44444,55555,   ", "11111,22222,33333,44444,55555",
                "11111,22222,33333,44444,55555,66666", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666   ", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,   ", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000   ", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,   ", "11111,22222,33333,44444,55555,66666"};

        Pattern p = Pattern.compile("((.{1,40})(,|$))");

        for (int i = 0; i < tests.length; i += 2) {
            String trimmed = tests[i].replaceAll(",?\\s*$", "");
            Matcher m = p.matcher(trimmed);

            if (m.find()) {    
                String g = m.group(2);

                if (!(tests[i + 1].equals(g))) {
                    System.out.println("Failed: \"" + g + "\"");         
                }
            } else {         
                System.out.println("Not Found: \"" + tests[i] + "\"");
            }
    }
String[]测试={
"11111", "11111",
"11111   ", "11111",
"11111,", "11111",
"11111,   ", "11111",
"11111,22222,33333,44444,55555", "11111,22222,33333,44444,55555",
"11111,22222,33333,44444,55555   ", "11111,22222,33333,44444,55555",
"11111,22222,33333,44444,55555,", "11111,22222,33333,44444,55555",
"11111,22222,33333,44444,55555,   ", "11111,22222,33333,44444,55555",
"11111,22222,33333,44444,55555,66666", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666   ", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,   ", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000   ", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,   ", "11111,22222,33333,44444,55555,66666"};
Pattern p=Pattern.compile((.{1,40})(,|$)”;
对于(int i=0;i
这应该涵盖所有测试。正则表达式几乎不需要任何帮助(来自另一个正则表达式)来修剪行尾空格和悬空逗号

 String[] tests = {
                "11111", "11111",
                "11111   ", "11111",
                "11111,", "11111",
                "11111,   ", "11111",
                "11111,22222,33333,44444,55555", "11111,22222,33333,44444,55555",
                "11111,22222,33333,44444,55555   ", "11111,22222,33333,44444,55555",
                "11111,22222,33333,44444,55555,", "11111,22222,33333,44444,55555",
                "11111,22222,33333,44444,55555,   ", "11111,22222,33333,44444,55555",
                "11111,22222,33333,44444,55555,66666", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666   ", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,   ", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000   ", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,", "11111,22222,33333,44444,55555,66666",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,   ", "11111,22222,33333,44444,55555,66666"};

        Pattern p = Pattern.compile("((.{1,40})(,|$))");

        for (int i = 0; i < tests.length; i += 2) {
            String trimmed = tests[i].replaceAll(",?\\s*$", "");
            Matcher m = p.matcher(trimmed);

            if (m.find()) {    
                String g = m.group(2);

                if (!(tests[i + 1].equals(g))) {
                    System.out.println("Failed: \"" + g + "\"");         
                }
            } else {         
                System.out.println("Not Found: \"" + tests[i] + "\"");
            }
    }
String[]测试={
"11111", "11111",
"11111   ", "11111",
"11111,", "11111",
"11111,   ", "11111",
"11111,22222,33333,44444,55555", "11111,22222,33333,44444,55555",
"11111,22222,33333,44444,55555   ", "11111,22222,33333,44444,55555",
"11111,22222,33333,44444,55555,", "11111,22222,33333,44444,55555",
"11111,22222,33333,44444,55555,   ", "11111,22222,33333,44444,55555",
"11111,22222,33333,44444,55555,66666", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666   ", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,   ", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000   ", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,", "11111,22222,33333,44444,55555,66666",
"11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,   ", "11111,22222,33333,44444,55555,66666"};
Pattern p=Pattern.compile((.{1,40})(,|$)”;
对于(int i=0;i
看起来这就是你要找的:

Pattern=Pattern.compile(“^(\\S{0,39}[^\\S,])(?=(,| \\S+|$))”;
Matcher Matcher=pattern.Matcher(csv);
字符串csvsub40lastcoma=matcher.find()?匹配器组(1):“”;
除了匹配正则表达式外,无需执行任何操作


你可以玩这个正则表达式。

看起来这就是你要找的:

Pattern=Pattern.compile(“^(\\S{0,39}[^\\S,])(?=(,| \\S+|$))”;
Matcher Matcher=pattern.Matcher(csv);
字符串csvsub40lastcoma=matcher.find()?匹配器组(1):“”;
除了匹配正则表达式外,无需执行任何操作


您可以使用这个正则表达式。

我建议您使用
String#substring
。只需在逗号上拆分字符串,并根据指定的长度迭代生成的数组(例如。
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] csvArr = { "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000", "11111", "11111   ",
                "11111,", "11111,   ", "11111,22222,33333,44444,55555", "11111,22222,33333,44444,55555   ",
                "11111,22222,33333,44444,55555,", "11111,22222,33333,44444,55555,   ",
                "11111,22222,33333,44444,55555,66666", "11111,22222,33333,44444,55555,66666   ",
                "11111,22222,33333,44444,55555,66666,", "11111,22222,33333,44444,55555,66666,   ",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000   ",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,",
                "11111,22222,33333,44444,55555,66666,77777,88888,99999,00000,   " };

        for (String csv : csvArr) {
            String[] values = csv.split(",");
            int i = 0, sum = 0;
            for (i = 0; i < values.length && sum + values[i].length() <= 40; i++, sum++) {
                sum += values[i].length();
            }
            String result = String.join(",", Arrays.copyOf(values, i)).trim();

            // Drop the last character if it's a comma
            int len = result.length();
            result = result.lastIndexOf(",") == len - 1 ? result.substring(0, len - 1) : result;

            System.out.println(result);
        }
    }
}
11111,22222,33333,44444,55555,66666
11111
11111
11111
11111
11111,22222,33333,44444,55555
11111,22222,33333,44444,55555
11111,22222,33333,44444,55555
11111,22222,33333,44444,55555
11111,22222,33333,44444,55555,66666
11111,22222,33333,44444,55555,66666
11111,22222,33333,44444,55555,66666
11111,22222,33333,44444,55555,66666
11111,22222,33333,44444,55555,66666
11111,22222,33333,44444,55555,66666
11111,22222,33333,44444,55555,66666
11111,22222,33333,44444,55555,66666