我想通过分隔符将字符串 "004-034556"
分成两个字符串 "-"
:
part1 = "004";
part2 = "034556";
这意味着第一个字符串将包含 '-'
之前的字符,第二个字符串将包含 '-'
之后的字符。
我还想检查字符串中是否包含 '-'
。
原文由 riyana 发布,翻译遵循 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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
使用适当命名的方法
String#split()
。请注意,
split
的参数假定为 正则表达式,因此请记住在必要时转义 特殊字符。例如,要在句点/点上拆分
.
(在正则表达式中表示“ 任何字符”),请使用 反斜杠\
转义单个特殊字符,如split("\\.")
,或使用 字符类[]
来表示文字字符,如split(Pattern.quote("."))
split("[.]")
,或使用Pattern#quote()
来转义整个字符串---
。要预先测试字符串是否包含某些字符,只需使用
String#contains()
。请注意,这不需要正则表达式。为此,请改用
String#matches()
。如果您想在结果部分中保留拆分字符,请使用 positive lookaround 。如果您希望拆分字符在左侧结束,请通过在模式上添加前缀
?<=
组来使用正向后视。如果您希望拆分字符在右侧结束,请通过在模式上添加前缀
?=
组来使用正向前瞻。如果您想限制结果部分的数量,那么您可以提供所需的数量作为
split()
方法的第二个参数。