根据位置提取双引号之间的单词

时间:2016-03-23 12:24:32

标签: java regex

我有一个单个字符串,其中包含多个引号,即:

"布鲁斯韦恩" " 43" "男性" "谭"

我想使用正则表达式创建一个方法,该方法根据字符串的位置从字符串中提取某些值。

因此,例如,如果我传递Int值1和3,它应该返回一个String: "布鲁斯韦恩" "男性"

请注意双引号是字符串的一部分,是转义字符(\")

3 个答案:

答案 0 :(得分:1)

如果已知(可能)组的数量,您可以使用正则表达式,例如"(.*?)"\s*"(.*?)"\s*"(.*?)"\s*"(.*?)"以及PatternMatcher,并按编号访问组(组0将始终为第一个匹配,第1组将是表达式中的第一个捕获组,依此类推。)

如果组的数量未知,您可以使用表达式"(.*?)"并使用Matcher#find()在循环中应用表达式并将所有匹配(在这种情况下为0)收集到列表中。然后使用索引访问列表元素(元素1将在索引0处)。

另一个替代方法是使用string.replaceAll("^[^\"]*\"|\"[^\"]*$","").split("\"\\s*\""),即删除前面或后面的任何文本的前导和尾随双引号,然后在引号上拆分,其间有可选的空格。

示例:

  • 假设字符串optional crap before "Bruce Wayne" "43" "male" "Gotham" optional crap after
  • string.replaceAll("^[^\"]*\"|\"[^\"]*$","")将导致Bruce Wayne" "43" "male" "Gotham
  • 对之前步骤的结果应用split("\"\\s*\"")将生成数组[Bruce Wayne, 43, male, Gotham]
  • 然后只需按索引(从零开始)访问数组元素

答案 1 :(得分:0)

我的功能从0开始。你说你想要1和3,但通常你在使用数组时从0开始。所以要得到布鲁斯韦恩"您要求0而不是1。 (如果你愿意的话,你可以改变它)

String[] getParts(String text, int... positions) {
    String results[] = new String[positions.length];

    Matcher m = Pattern.compile("\"[^\"]*\"").matcher(text);

    for(int i = 0, j = 0; m.find() && j < positions.length; i++) {
        if(i != positions[j]) continue;
        results[j] = m.group();
        j++;
    }

    return results;
}

// Usage
public Test() {

     String[] parts = getParts(" \"Bruce Wayne\" \"43\" \"male\" \"Gotham\" ", 0, 2);
     System.out.println(Arrays.toString(parts));
     // = ["Bruce Wayne", "male"]

}

该方法接受任意数量的参数。

getParts(" \"a\" \"b\" \"c\" \"d\" ", 0, 2, 3); // = a, c, d
// or 
getParts(" \"a\" \"b\" \"c\" \"d\" ", 3); // = d

答案 2 :(得分:0)

根据位置提取单词的功能:

like

然后可以提取单词:

IN

输出:

from movies m where m.name in (:keywords)
相关问题