如何在 Java 中提取多引号子字符串

How to extract a multiple quoted substrings in Java

我有一个包含多个子字符串的字符串,必须将其提取出来。将被提取的字符串介于 ' 个字符之间。

当我使用 indexOf 或 regex 时,我只能提取第一个或最后一个。

如何提取它们并将它们放入数组或列表中而不只解析相同的字符串?

resultData = "Error 205: 'x' data is not crawled yet. Check 'y' and 'z' data and update dataset 't'";

下面我试过了;

protected static String errorsTPrinted(String errStr, int errCode) { 

if (errCode== 202 ) {

ArrayList<String> ar = new ArrayList<String>();
Pattern p = Pattern.compile("'(.*?)'");
Matcher m = p.matcher(errStr);
String text;

for (int i = 0; i < errStr.length(); i++) {

m.find();
text = m.group(1);
ar.add(text);
}

return errStr = "Err 202: " + ar.get(0) + " ... " + ar.get(1) + " ..." + ar.get(2) + " ... " + ar.get(3);
}

编辑

我使用了@MinecraftShamrock 的方法。

if (errCode== 202 ) {
List<String> getQuotet = getQuotet(errStr, '\'');
return errStr = "Err 202: " + getQuotet.get(0) + " ... " + getQuotet.get(1) + " ..." + getQuotet.get(2) + " ... " + getQuotet.get(3);
}

只需使用模式:

'([^']++)'

还有一个 Matcher 像这样:

final Pattern pattern = Pattern.compile("'([^']++)'");
final Matcher matcher = pattern.matcher(resultData);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

这遍历 String 中的每个匹配项并打印它。

输出:

x
y
z
t

这是一个简单的方法(假设没有转义字符等):

// Compile a pattern to find the wanted strings
Pattern p = Pattern.compile("'([^']+)'");
// Create a matcher for given input
Matcher m = p.matcher(resultData);
// A list to put the found strings into
List<String> list = new ArrayList<String>();
// Loop over all occurrences
while(m.find()) {
  // Retrieve the matched text
  String text = m.group(1);
  // Do something with the text, e.g. add it to a List
  list.add(text);
}

您可以使用这种非常简单的算法来避免正则表达式(因为不能 100% 确定其复杂性):

public List<String> getQuotet(final String input, final char quote) {
    final ArrayList<String> result = new ArrayList<>();
    int n = -1;
    for(int i = 0; i < input.length(); i++) {
        if(input.charAt(i) == quote) {
            if(n == -1) { //not currently inside quote -> start new quote
                n = i + 1;
            } else { //close current quote
                result.add(input.substring(n, i));
                n = -1;
            }
        }
    }
    return result;
}

这适用于任何所需的引号字符,运行时复杂度为 O(n)。如果字符串以左引号结尾,则不会包含在内。但是,这可以很容易地添加。

我认为这比正则表达式更可取,因为您可以绝对确定它的复杂性。此外,它适用于最少的库 类。如果您关心大输入的效率,请使用它。

最后但同样重要的是,它绝对不关心两个引号字符之间的内容,因此它适用于任何输入字符串。