【问题标题】:How to extract a multiple quoted substrings in Java如何在Java中提取多个引用的子字符串
【发布时间】:2015-02-08 10:09:08
【问题描述】:

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

当我使用 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);
}

【问题讨论】:

  • 这不应该那么复杂。你能发布一些你已经尝试过但很沮丧最终跑到这里来的东西吗?
  • '(.*?)' 是你想要的。我不会向您展示完整的解决方案,请先自己尝试,如果您有问题,请告诉我们。
  • @MarounMaroun 我试过了,结果我只得到 'x' 而 y,z,t 结果消失了。
  • 你应该循环所有匹配。
  • @LunaticFnatic 将其添加到您的问题中。这正是为什么这是一个“编辑”按钮。

标签: java regex string substring


【解决方案1】:

您可以使用这种非常简单的算法来避免使用正则表达式(因为不能 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)。如果字符串以开放引号结尾,则不包括在内。但是,这可以很容易地添加。

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

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

【讨论】:

  • 这是一个非常好的方法。我正在解析一个 json 错误代码并简单地更改它的语言。对解析 json 文本中的变量不太熟悉,所以我正在解析它的子字符串并重新编写错误。我最好使用它,谢谢。
【解决方案2】:

只需使用模式:

'([^']++)'

还有一个像这样的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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多