如何在 Java 中拆分字符串?

新手上路,请多包涵

我想通过分隔符将字符串 "004-034556" 分成两个字符串 "-"

 part1 = "004";
part2 = "034556";

这意味着第一个字符串将包含 '-' 之前的字符,第二个字符串将包含 '-' 之后的字符。

我还想检查字符串中是否包含 '-'

原文由 riyana 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 774
2 个回答

使用适当命名的方法 String#split()

 String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556

请注意, split 的参数假定为 正则表达式,因此请记住在必要时转义 特殊字符

there are 12 characters with special meanings: the backslash \ , the caret ^ , the dollar sign $ , the period or dot . , the vertical bar or pipe symbol | , the question mark ? , the asterisk or star * , the plus sign + , the opening parenthesis ( , the closing parenthesis ) , and the opening square bracket [ , the opening curly brace { , These special characters are通常称为“元字符”。

例如,要在句点/点上拆分 . (在正则表达式中表示“ 任何字符”),请使用 反斜杠 \ 转义单个特殊字符,如 split("\\.") ,或使用 字符类 [] 来表示文字字符,如 split(Pattern.quote(".")) split("[.]") ,或使用 Pattern#quote() 来转义整个字符串 ---

 String[] parts = string.split(Pattern.quote(".")); // Split on the exact string.

要预先测试字符串是否包含某些字符,只需使用 String#contains()

 if (string.contains("-")) {
    // Split it.
} else {
    throw new IllegalArgumentException("String " + string + " does not contain -");
}

请注意,这不需要正则表达式。为此,请改用 String#matches()

如果您想在结果部分中保留拆分字符,请使用 positive lookaround 。如果您希望拆分字符在左侧结束,请通过在模式上添加前缀 ?<= 组来使用正向后视。

 String string = "004-034556";
String[] parts = string.split("(?<=-)");
String part1 = parts[0]; // 004-
String part2 = parts[1]; // 034556

如果您希望拆分字符在右侧结束,请通过在模式上添加前缀 ?= 组来使用正向前瞻。

 String string = "004-034556";
String[] parts = string.split("(?=-)");
String part1 = parts[0]; // 004
String part2 = parts[1]; // -034556

如果您想限制结果部分的数量,那么您可以提供所需的数量作为 split() 方法的第二个参数。

 String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42

原文由 BalusC 发布,翻译遵循 CC BY-SA 4.0 许可协议

直接处理字符串的另一种方法是使用带捕获组的正则表达式。这样做的好处是可以直接暗示对输入的更复杂的约束。例如,以下将字符串分成两部分,并确保两部分都只包含数字:

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

class SplitExample
{
    private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)");

    public static void checkString(String s)
    {
        Matcher m = twopart.matcher(s);
        if (m.matches()) {
            System.out.println(s + " matches; first part is " + m.group(1) +
                               ", second part is " + m.group(2) + ".");
        } else {
            System.out.println(s + " does not match.");
        }
    }

    public static void main(String[] args) {
        checkString("123-4567");
        checkString("foo-bar");
        checkString("123-");
        checkString("-4567");
        checkString("123-4567-890");
    }
}

由于模式在这个实例中是固定的,它可以提前编译并存储为静态成员(在示例中的类加载时初始化)。正则表达式是:

 (\d+)-(\d+)

括号表示捕获组;匹配正则表达式那部分的字符串可以通过 Match.group() 方法访问,如图所示。 \d 匹配单个十进制数字,+ 表示“匹配前面的一个或多个表达式”。- 没有特殊含义,因此只匹配输入中的那个字符。请注意,您需要双转义反斜杠将其写为 Java 字符串时。其他一些示例:

 ([A-Z]+)-([A-Z]+)          // Each part consists of only capital letters
([^-]+)-([^-]+)            // Each part consists of characters other than -
([A-Z]{2})-(\d+)           // The first part is exactly two capital letters,
                           // the second consists of digits

原文由 Rob Hague 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题