查找以某个单词开头和结尾的子字符串

时间:2020-11-02 14:12:40

标签: java groovy substring

我正在尝试使用groovy(或Java)从文本文件的每一行提取子字符串。我正在努力寻找一种有效的方法来处理长字符串,其中包含我感兴趣的子字符串。可以说我有以下字符串:

String lineNew = "Error in file C:/Desktop/calc.groovy: assert "A1" == "A2""

现在,我想从此字符串中提取两条信息:首先,我想获取文件名,该文件名始终以C:/开头并以.groovy结尾。
其次,我想得到一个错误,该错误将始终是“ groovy:”之后的子字符串。

所以我的问题基本上是在字符串中找到子字符串,这些子字符串以特定单词开头和结尾。因此,startswith(),matches(),substring()(适用于单词的位置)之类的方法对我来说一直没有用。

有人遇到过相同的问题,还是知道一种有效的方法来解决此类问题?感谢您的任何帮助,

4 个答案:

答案 0 :(得分:3)

尝试捕获组。这是Groovy代码:

def matches = lineNew =~ /(C:.*?\.groovy): (.*)/
def sourceFile = matches[0][1]     // C:/Desktop/calc.groovy
def errorMessage = matches[0][2]   // assert "A1" == "A2"

答案 1 :(得分:1)

您需要做的是获取“ C:/”和“ .groovy”的索引。因此,类似:

int start = lineNew.indexOf("C:/");
int end = lineNew.indexOf(".groovy");
String filename = lineNew.substring(start, end);
int errIndex = lineNew.indexOf(whatever marks the end of the error);
String error = lineNew.substring(end, errIndex);

我没做过Java,所以我忘记了substring方法是包含式的还是indexOf方法返回的确切索引是什么,因此您必须弄清楚其中的一个,但是一般的逻辑应该起作用。

答案 2 :(得分:1)

您可以看一下模式匹配来解决此问题。

public static void main(String[] args) {
    String lineNew = "Error in file C:/Desktop/calc.groovy: assert \"A1\" == \"A2\"";
    // define two groups, one for file name and second for message
    Pattern pattern = Pattern.compile(".*(C:.*.groovy):\\s(.*)");
    Matcher matcher = pattern.matcher(lineNew);
    if (matcher.matches()) {
        System.out.println(matcher.group(1)); // filename
        System.out.println(matcher.group(2)); // error message
    }
}

答案 3 :(得分:1)

您可以尝试使用正则表达式-它们在这类问题上非常有用。

这是我摘自tutorialspoint的代码示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      }else {
         System.out.println("NO MATCH");
      }
   }
}

有一个很好的正则表达式匹配器here,它也解释了各种元素将匹配什么。 Here是所有模式的列表。

对于第一个问题,您可以使用类似

的表达式

C:.*groovy

匹配文件路径的字符串。

第二个是这样的

(?<=groovy:\s).*

但是请注意,像这样使用。*有点危险,因为它基本上匹配任何内容(。),直到下一个空格字符(*)。不过,如果您输入的内容始终看起来像您发布的内容一样,那么它将起作用。