2013-02-11 24 views
0

我从来没有理解如何正确地使用正则表达式来划分我的字符串。 我有这个类型的字符串example = "on[?a, ?b, ?c]";的 有时候我都这样了,弦乐example2 = "not clear[?c]";Java String正则表达式划分 - 总是相同的模式

对于第一个例子,我想分成这样的:

[on, a, b, c] 

String name = "on"; 
String [] vars = [a,b,c]; 

而为第二个例子我想分成这样的类型: [不清楚,c] 或

String name = "not clear"; 
String [] vars = [c]; 

非常感谢提前家伙;)

+0

嗯,我知道我可以在不同的步骤做到这一点,首先看char字符,直到[然后我会有名字,其余的变量,然后会同样的变量,看char字符..但我想这将是非常糟糕的表现:s 感谢您的答复的方式;) – TiagoM 2013-02-11 16:49:23

回答

3

如果你知道字符集的标识符,你可以简单地做一个分割上所有的文字是不在那一套。例如,如果你的标识符只包含文字字符([a-zA-Z_0-9]),可以使用:

String[] parts = "on[?a, ?b, ?c]".split("[\\W]+"); 
String name = parts[0]; 
String[] vars = Arrays.copyOfRange(parts, 1, parts.length); 

如果你的标识符只有A-Z(上,下),你可以用^A-Za-z取代\\W以上。

我觉得这比使用复杂的正则表达式更优雅。

编辑:我意识到这将有你的第二个例子“不清楚”的问题。如果你没有使用类似的下划线,而不是有没有空间的选项,你可以做[?(或子)的一方分获得“名”,而在其余的另一个分裂,就像这样:

String s = "not clear[?a, ?b, ?c]"; 
String[] parts = s.split("\\[\\?"); //need the '?' so we don't get an extra empty array element in the next split 
String name = parts[0]; 
String[] vars = parts[1].split("[\\W]+"); 
+0

第二个选项工作得很好,所有的情况下!非常感谢! 我希望有一天,我会理解正则表达式的事情:P 再次感谢;) – TiagoM 2013-02-11 17:40:29

2

此接近,但问题是实际上是重复了第三个记忆组,因此只有抓住了最后一场比赛。

(.*?)\[(?:\s*(?:\?(.*?)(?:\s*,\s*\?(.*?))*)\s*)?] 

例如,你列出on[?a, ?b, ?c]第一个将给予第1组作为on,2作为a 3为c。如果你正在使用perl的,你可以在g标志的正则表达式应用到线多次,并使用此:

my @tokens; 
while (my $line =~ /\s*(.*?)\s*[[,\]]/g) { 
    push(@tokens, $1); 
} 

注意,我并没有实际测试的Perl代码,就在我的头顶。它应该给你的想法虽然

+0

感谢您的努力,但让我的问题已经回答:) – TiagoM 2013-02-11 17:42:03

1
String[] parts = example.split("[^\\w ]"); 
    List<String> x = new ArrayList<String>(); 
    for (int i = 0; i < parts.length; i++) { 
     if (!"".equals(parts[i]) && !" ".equals(parts[i])) { 
      x.add(parts[i]); 
     } 
    } 

只要您没有超过一个空格分隔非空格字符,就会工作。可能有一个更清晰的方法来过滤掉null和“”字符串。

+1

感谢您的努力,但得到了我的问题已经回答:) – TiagoM 2013-02-11 17:41:05

+1

我认为我的答案更一般。好吧... ;) – mohit6up 2013-02-11 17:45:10