Java String Regex Divide - 始终是相同的模式

时间:2013-02-11 16:39:46

标签: java regex string

我从来不知道如何正确使用正则表达式来划分我的字符串。 我有这种类型的字符串example = "on[?a, ?b, ?c]"; 有时我有这个,字符串example2 = "not clear[?c]";

对于第一个例子,我想分为:

[on, a, b, c] 

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

对于第二个例子,我想分成这种类型: [不清楚,c] 或

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

非常感谢你们;)

3 个答案:

答案 0 :(得分: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(上下),则可以将上面的\\W替换为^A-Za-z

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

编辑:我意识到这会使你的第二个例子“不清楚”出现问题。如果你没有选择使用下划线而不是空格的东西,你可以在[?(或子串)上进行一次拆分以获得“名称”,并在余数上进行另一次拆分,如下所示: / p>

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]+");

答案 1 :(得分:2)

这很接近,但问题是第三个记住的组实际上是重复的,所以它只捕获最后一个匹配。

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

例如,您列出的第一个on[?a, ?b, ?c]会将第1组视为on,将a 3视为c。如果您使用的是perl,则g标志可以多次将一个正则表达式应用于一行并使用它:

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

注意,我实际上并没有测试perl代码,只是在我的脑海中。它应该给你这个想法

答案 2 :(得分: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和“”字符串。