查找以特定单词开头和结尾的子字符串

Finding a substring starting and ending with certain word

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

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

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

所以我的问题基本上是在字符串中找到以特定单词开头和结尾的子字符串。因此,诸如 startswith()、matches()、substring()(与单词的位置一起使用)之类的方法对我不起作用。

有没有人遇到过同样的问题或者知道处理这类问题的有效方法?非常感谢任何帮助,提前致谢

你需要做的是获取“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 方法的确切索引是什么 returns,所以你必须弄清楚,但一般逻辑应该有效。

你可以看看模式匹配来解决这个问题。

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
    }
}

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

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

您可以尝试使用正则表达式 - 它们非常适合解决此类问题。

这是我从 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 that also explains what the various elements will match. Here是所有模式的列表。

对于你的第一个问题,你可以使用像

这样的表达式

C:.*groovy

匹配文件路径的字符串。

第二个是这样的

(?<=groovy:\s).*

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