[英]Java get substring or split from multiline String
I want to get one String from a String composed of many lines 我想从由多行组成的字符串中获取一个字符串
Example String: 示例字符串:
Date: May 12, 20003
ID: 54076
Content: Test
filename: Testing.fileextension
folder: Test Folder
endDate: May 13, 2003
The output I want is "Testing.filextension"
I tried a couple methods, but none return just the filename. 我想要的输出是"Testing.filextension"
我尝试了几种方法,但没有一个仅返回文件名。
Method Attempt 1: 方法尝试1:
String[] files = example.substring(example.indexOf("filename: ")
for (String filename : files){
System.out.printlin(filename);
}
Method Attempt 2 was to try to split on a newline, but right now it just returns all the lines. 方法尝试2试图在换行符上进行拆分,但现在它仅返回所有行。 My main issue is that the .split
method takes (String, int)
, however, I don't have the int. 我的主要问题是.split
方法采用(String, int)
,但是我没有int。
String[] files = example.split("\\r?\\n");
for (String filename : files){
System.out.println(filename)
}
What about using streams? 怎样使用流? You should consider filtering lines you cannot split, eg when the splitting character is missing. 您应该考虑过滤无法拆分的行,例如,缺少拆分字符时。
So try this one: 所以试试这个:
Map<String, String> myMap = Arrays.stream(myString.split("\\r?\\n"))
.map(string -> string.split(": "))
.collect(Collectors.toMap(stringArray -> stringArray[0],
stringArray -> stringArray[1]));
System.out.println(myMap.get("filename"));
Is there another limitation? 还有其他限制吗? If not just combine with an if: 如果不是,则仅与if结合使用:
String keyword = "filename: ";
String[] files = example.split("\\r?\\n");
for(String file : files) {
if(file.startsWith(keyword)){
System.out.println(file.substring(keyword.length()));
}
}
You can filter it this way: 您可以通过以下方式对其进行过滤:
String[] files = example.split("\\r?\\n");
for (String filename : files){
if (filename.startsWith("filename"))
System.out.println(filename);
}
use 采用
String[] files = example.split("\\r?\\n");
for (String filename : files){
if (filename.startsWith("filename"))
System.out.println(filename);
}
and if you wan't filename without fileextension 如果没有文件扩展名就不要文件名
String[] files = example.split("\\r?\\n");
for (String filename : files){
if (filename.startsWith("filename"))
System.out.println(filename.split(".")[0]);
}
try this: 尝试这个:
String searchStr = "filename:";
example.substring(example.indexOf(searchStr) + searchStr.length()).split("\n")[0].trim();
Though I would suggest you that to structure the input into a HashMap, which would be easier for later use. 尽管我建议您将输入结构化为HashMap,但以后使用起来会更容易。
/**
* @Author Jack <J@ck>
* https://stackoverflow.com/questions/49264343/java-get-substring-or-split-from-multiline-string
*/
public class StringFromStringComposedOfManyLines {
public static void main(String[] args) {
String manyLinesString =
"Date: May 12, 20003\n" +
"ID: 54076\n" +
"Content: Test\n" +
"filename: Testing.fileextension\n" +
"folder: Test Folder\n" +
"endDate: May 13, 2003\n";
System.out.println(manyLinesString);
// Replace all \n \t \r occurrences to "" and gets one line string
String inLineString = manyLinesString.replaceAll("\\n|\\t||\\r", "");
System.out.println(inLineString);
}
}
Out: Date: May 12, 20003ID: 54076Content: Testfilename: Testing.fileextensionfolder: Test FolderendDate: May 13, 2003 出:日期:20003年5月12日ID:54076内容:测试文件名:Testing.fileextension文件夹:测试文件夹结束日期:2003年5月13日
I'd suggest using regular expression and named group like this: 我建议使用正则表达式和命名组,如下所示:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegExTest {
public static void main(String[] args) {
// Your example string
String exampleStr = "Date: May 12, 20003\nID: 54076\nContent: Test\nfilename: Testing.fileextension\nfolder: Test Folder\nendDate: May 13, 2003.";
/* create the regex:
* you are providing a regex group named fname
* This code assumes that the file name ends with a newline/eof.
* the name of the group that will match the filename is "fname".
* The brackets() indicate that this is a named group.
*/
String regex = "filename:\\s*(?<fname>[^\\r\\n]+)";
// create a pattern object by compiling the regex
Pattern pattern = Pattern.compile(regex);
// create a matcher object by applying the pattern on the example string:
Matcher matcher = pattern.matcher(exampleStr);
// if a match is found
if (matcher.find()) {
System.out.println("Found a match:");
// output the content of the group that matched the filename:
System.out.println(matcher.group("fname"));
}
else {
System.out.println("No match found");
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.