我有一个单个字符串,其中包含多个引号,即:
"布鲁斯韦恩" " 43" "男性" "谭"
我想使用正则表达式创建一个方法,该方法根据字符串的位置从字符串中提取某些值。
因此,例如,如果我传递Int值1和3,它应该返回一个String: "布鲁斯韦恩" "男性"
请注意双引号是字符串的一部分,是转义字符(\")
答案 0 :(得分:1)
如果已知(可能)组的数量,您可以使用正则表达式,例如"(.*?)"\s*"(.*?)"\s*"(.*?)"\s*"(.*?)"
以及Pattern
和Matcher
,并按编号访问组(组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)