使用通配符拆分字符串

时间:2014-08-05 13:27:41

标签: java regex string split wildcard

我有一个变量String,它包含我需要的值和分割器。问题是,字符串的长度是可变的,也是分离器的类型。它们通过XML文件到达。

字符串将如下所示:

1+"."+20+"."+51+"."+2+"name.jpg"

但也可以是:

1+"*"+20+"*"+51+"name.jpg"

坚实的因素是: 数字是我需要检索的id。 分割器值将在“引号”之间。

id的数量未知,可以是一个,可以是200 用于拆分的值可以是一切,但总是在两个引号之间

我正在寻找一种方法将字符串拆分为“.”,而不是点(.)给出一个通配符,可以是1个字符或多个。

注意:引号之间的值可以是任何值!甚至不必是单个字符

4 个答案:

答案 0 :(得分:2)

尝试通过正则表达式进行拆分,例如:

String regex = "\\+?\"[^\"]*\"\\+?";
System.out.println(Arrays.toString( "1+\".\"+20+\".\"+51+\".\"+2+\"name.jpg\"".split( regex ) ));
System.out.println(Arrays.toString( "1+\"*\"+20+\"*\"+51+\"name.jpg\"".split( regex ) ));

输出:

[1, 20, 51, 2]
[1, 20, 51]

正则表达式将匹配任意2个双引号,其间包含非双引号字符,并且前面/后面是可选的加号。您可以扩展它以允许空白,例如"\\s*\\+?\\s*\"[^\"]*\"\\s*\\+?\\s*"。分割器中唯一不允许的是双引号。

如果您还需要该名称,您可以尝试在正则表达式中定义潜在的分割器, 例如
"(\\+?\"[\\.\\*]*\"\\+?)|\\+?\""

请注意,在这种情况下,您必须考虑名称周围的引号,即要分割2+"name.jpg"您必须添加替代\+?"(双引号前面带有可选加号)。

<强>更新

其他示例(输入 - >输出)

5+".."+272+"..."+21+"splitter"+2+"name.jpg" --> [5, 272, 21, 2]
444+"()"+0+"abc"+51+"__"+2+"name.jpg" --> [444, 0, 51, 2]
1+"."+20+"."+51+"."+2+"name.jpg" --> [1, 20, 51, 2]
1+"*"+20+"*"+51+"name.jpg" --> [1, 20, 51]

答案 1 :(得分:1)

你不能尝试这样的事情:

String oldStr=1+"."+20+"."+51+"."+2+"name.jpg";
String newStr= oldStr.replace("name.jpg",""); // or you can use regex such as : oldStr.replaceAll("(\w+.\w+)","");

String[] array;
array=newStr.split(".");
if(array==null || array.length==0){
 array=newStr.split("*");
}

答案 2 :(得分:1)

所以,只要我说得对,可能的文件名/字符串值是:

1.20.51.2name.jpg
1*20*51*name.jpg

右?

所以更一般的你可以说:一些未知数量的数字,由一个非数字字符分开?

您可以对每个字符串执行RegEx语句:\d+。 如果全局执行,您将获得每个数字的列表。

1.20.51.2name.jpg

我得到了

1, 20, 51, 2

答案 3 :(得分:0)

使用此:

    String x = 1+"."+20+"."+51+"."+2+"name.jpg";
    String y = 1+"*"+20+"*"+51+"name.jpg";

    System.out.println(Arrays.toString(x.split("\\.|\\*")));
    System.out.println(Arrays.toString(y.split("\\.|\\*")));

会给你以下输出:

[1, 20, 51, 2name, jpg]
[1, 20, 51name, jpg]