java正则表达式多分隔符按顺序拆分

ycggw6v2  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(248)

我正在尝试拆分一个包含多个分隔符的字符串,但首先要检查该字符串是否满足正则表达式,然后基于它进行拆分。example:- the teststring将按特定顺序包含://、:、@、:、/这些字符,我需要首先检查给定的字符串是否满足模式,如果满足,然后拆分它。字符串中的其他字符也可以包含这些字符,但我需要根据这些字符的顺序进行拆分://,:,@,:/

String testString = "aman://jaspreet:raman!@127.0.0.1:5031/test";
String[]tokens = testString.split("://|\\:|@|\\:|\\/");
for(String s:tokens) {
    System.out.println(s);
}

在上面我已经尝试过正则表达式拆分,但是没有通过按顺序检查来拆分。它只检查字符串中是否存在任何给定的正则表达式字符,然后根据它进行拆分。

cwtwac6a

cwtwac6a1#

如果你先验证模式,那么你就不应该这么做 split() 之后。使用捕获组收集已验证的数据。
e、 在一个简单的例子中, foo@bar ,带分隔符 @ ,您将使用 ^([^@]+)@(.+)$ ,即匹配和捕获最多 @ ,匹配但不捕获 @ ,然后匹配并捕获其余部分:

Pattern p = Pattern.compile("^([^@]+)@(.+)$");
Matcher m = p.matcher("foo@bar");
if (! m.matches()) {
    // invalid data
} else {
    String a = m.group(1); // a = "foo"
    String b = m.group(2); // b = "bar"
    // use a and b here
}

对于问题中的匹配,宽松模式可以是:

^(.*?)://(.*?):(.*?)@(.*?):(.*?)/(.*)$

然后使用上面的代码,但是使用:

String scheme   = m.group(1); // "aman"
    String user     = m.group(2); // "jaspreet"
    String password = m.group(3); // "raman!"
    String host     = m.group(4); // "127.0.0.1"
    String port     = m.group(5); // "5031"
    String path     = m.group(6); // "test"

要进行更严格的匹配,请更换 .*? 具有只匹配允许字符的模式,例如。 [^:]+ 如果不能为空且不能包含冒号。
或者,您可以使用 URI 类来分析url字符串。

String testString = "aman://jaspreet:raman!@127.0.0.1:5031/test";
URI uri = URI.create(testString);

String scheme   = uri.getScheme();   // "aman"
String userInfo = uri.getUserInfo(); // "jaspreet:raman!"
String host     = uri.getHost();     // "127.0.0.1"
String port     = uri.getPort();     // "5031"
String path     = uri.getPath();     // "test"

相关问题