我正在尝试使用groovy(或Java)从文本文件的每一行提取子字符串。我正在努力寻找一种有效的方法来处理长字符串,其中包含我感兴趣的子字符串。可以说我有以下字符串:
String lineNew = "Error in file C:/Desktop/calc.groovy: assert "A1" == "A2""
现在,我想从此字符串中提取两条信息:首先,我想获取文件名,该文件名始终以C:/开头并以.groovy结尾。
其次,我想得到一个错误,该错误将始终是“ groovy:”之后的子字符串。
所以我的问题基本上是在字符串中找到子字符串,这些子字符串以特定单词开头和结尾。因此,startswith(),matches(),substring()(适用于单词的位置)之类的方法对我来说一直没有用。
有人遇到过相同的问题,还是知道一种有效的方法来解决此类问题?感谢您的任何帮助,
答案 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).*
但是请注意,像这样使用。*有点危险,因为它基本上匹配任何内容(。),直到下一个空格字符(*)。不过,如果您输入的内容始终看起来像您发布的内容一样,那么它将起作用。