0

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

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

[on, a, b, c] 

或者

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

对于第二个例子,我想分为这种类型:[not clear, c] 或

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

非常感谢你们;)

4

3 回答 3

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);

如果您的标识符只有 AZ(上下),您可以将\\W上面替换为^A-Za-z.

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

编辑:我意识到你的第二个例子“不清楚”会有问题。如果您没有选择使用下划线代替空格之类的东西,您可以在[?(或子字符串)上进行一次拆分以获取“名称”,然后在其余部分上进行另一次拆分,如下所示:

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]+");
于 2013-02-11T17:09:09.470 回答
2

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

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

例如,您列出的第一个on[?a, ?b, ?c]将给 group 1 as on, 2 as a3 as c。如果您使用的是 perl,您可以使用该g标志多次将正则表达式应用于一行并使用它:

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

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

于 2013-02-11T17:08:17.253 回答
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 和 " " 字符串。

于 2013-02-11T17:33:23.660 回答