【问题标题】:How to extract specific substring from a bigger string java如何从更大的字符串java中提取特定的子字符串
【发布时间】:2012-12-06 04:47:36
【问题描述】:

我有以下字符串:

String n = "(.........)(......)(.......)(......) etc"

我想编写一个方法,用n 的每个子字符串填充List<String>,该子字符串介于( 和) 之间。提前谢谢!

【问题讨论】:

  • 你已经尝试了什么?
  • 括号可以嵌套吗?
  • 这是一种有趣的事情,你会挑战自己去做,而不是让别人为你做!
  • 没有任何嵌套括号

标签: java regex substring


【解决方案1】:

我对 String 方法不是很熟悉,所以我确信有一种方法可以完成,而无需自己编写代码,只需使用一些花哨的方法,但是你去吧:

经过测试,100% 完美运行 :)

String string = "(stack)(over)(flow)";
ArrayList<String> subStrings = new ArrayList<String>();
for(int c = 0; c < string.length(); c++) {
    if(string.charAt(c) == '(') {
        c++;
        String newString = "";
        for(;c < string.length() && string.charAt(c) != ')'; c++) {
            newString += string.charAt(c);
        }
        subStrings.add(newString);
    }
}

【讨论】:

  • 它会起作用,但由于它不处理嵌套括号,我认为与简单的正则表达式相比没有优势(它也不能处理嵌套括号)。 newString += string.charAt(c); 效率不高,您可以使用StringBuilder 来提高性能。
  • @jlordo 我想他必须自己建立这个。 (哈哈)。
【解决方案2】:

一行就可以搞定:

String[] parts = input.replaceAll("(^.*\\()|(\\).*$)", "").split("\\)\\(");

对replaceAll() 的调用会去掉租用括号和尾括号(加上第一个/最后一个括号之前/之后的任何其他垃圾字符),然后您只需在括号对上使用split()。

【讨论】:

  • 聪明...假设输入格式正确。
【解决方案3】:

如果 (...) 对没有嵌套,您可以在 Java 中使用正则表达式。看看 java.util.regex.Pattern 类。

【讨论】:

    【解决方案4】:

    这应该可行:

        String in = "(bla)(die)(foo)";
        in = in .substring(1,in.length()-1);
        String[] out = in .split(Pattern.quote(")("));
    

    【讨论】:

      【解决方案5】:

      我制作了这个正则表达式版本,但有点冗长。我确信它可以改进。 (注意:“n”是你的输入字符串)

          Pattern p = Pattern.compile("\\((.*?)\\)");
          Matcher matcher = p.matcher(n);
          List<String> list = new ArrayList<String>();
          while (matcher.find())
          {
              list.add(matcher.group(1));  // 1 == stuff between the ()'s
          }
      

      【讨论】:

      • 您不需要跟踪下一个匹配的偏移量并使用find(int) 方法将其插入;无参数 find() 方法为您处理所有这些。
      • 嘿,你是对的!谢谢艾伦!我相应地更新了代码,从 find() 调用中删除了int offset 计数器,并在循环中增加了它(这是一个词吗?)。
      猜你喜欢
      • 2012-02-18
      • 2011-10-06
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多