如何正确使用 Matcher 检索字符串的前 30 个字符?

How do I properly use Matcher to retrieve first 30 chars of a String?

我的目标是 return 用户输入字符串的前 30 个字符及其 return 在电子邮件主题行中输入。

我目前的解决方案是这样的:

 Matcher matcher = Pattern.compile(".{1,30}").matcher(Item.getName());
    String subject = this.subjectPrefix + "You have been assigned to Item Number " + Item.getId() + ": " + matcher + "...";

为匹配器return编辑的是“java.util.regex.Matcher[pattern=.{1,30} region=0,28 lastmatch=]”

改用substring

String str = "....";
String sub = str.substring(0, 30);

好吧,如果你真的需要使用Matcher,那就试试:

Matcher matcher = Pattern.compile(".{1,30}").matcher("123456789012345678901234567890");
if (matcher.find()) {
    String subject = matcher.group(0);
}

不过最好用substring的方法:

String subject = "123456789012345678901234567890".substring(0, 30);

我觉得用String.substring()比较好:

public static String getFirstChars(String str, int n) {
    if(str == null)
        return null;
    return str.substring(0, Math.min(n, str.length()));
}

如果你真的想使用regexp,那么这是一个例子:

public static String getFirstChars(String str, int n) {
    if (str == null)
        return null;

    Pattern pattern = Pattern.compile(String.format(".{1,%d}", n));
    Matcher matcher = pattern.matcher(str);
    return matcher.matches() ? matcher.group(0) : null;
}

我个人也会使用字符串 class 的 substring 方法。

但是,不要想当然地认为您的字符串至少有 30 个字符长,我猜这可能是您问题的一部分:

    String itemName = "lorem ipsum";
    String itemDisplayName = itemName.substring(0, itemName.length() < 30 ? itemName.length() : 30);
    System.out.println(itemDisplayName);

这利用了三元运算符,其中您有一个布尔条件,然后和其他。因此,如果您的字符串短于 30 个字符,我们将使用整个字符串并避免 java.lang.StringIndexOutOfBoundsException.