[英]Java Substring from multiline string
我有一个要求编辑字符串并显示
输入字符串:
邀请 URL: www.someurl.com id:12345678 dial:+98765432 code:0192837465 AccessCode:12345 密码:abc
这里有一些线
我不想显示最后 3 行,
我试图搜索空行的索引并将 substring 从索引 0 获取到空行索引
int index = mystring.indexof(("\\r\\n"));
mystring.substring(0,index)
但是索引总是返回-1。 我的疑问是如何找到空字符串的索引。
我想要来自 InviteURL 的 substring 直到 AccessCode 或 Password(AccessCode 和 Password 都将存在或仅 AccessCode 将存在),之后我必须跳过任何其他附加行
Output 预期:
邀请 URL: www.someurl.com id:12345678
拨号:+98765432
代码:0192837465
密码:abc
public static void main(String[] args) {
String myString = "URL: www.someurl.com\n" +
"id:12345678\n" +
"dial:+98765432\n" +
"code:0192837465\n" +
"password:abc\n" +
"\n" +
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
"some line here\n" +
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
String[] split = myString.split("\\n\\n");
System.out.println(split[0]);
}
有很多方法可以做到这一点,但最简单的方法很可能是:
String inputString ="URL: www.someurl.com\n" +
"id:12345678\n" +
"dial:+98765432\n" +
"code:0192837465\n" +
"password:abc\n" +
"\n" +
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
"some line here\n" +
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
if (inputString.contains("\r\n")) {
inputString = inputString.substring(0, inputString.indexOf("\r\n\r\n")).trim();
}
else {
inputString = inputString.substring(0, inputString.indexOf("\n\n")).trim();
}
System.out.println(inputString);
另一种简单的方法是:
String inputString ="URL: www.someurl.com\n" +
"id:12345678\n" +
"dial:+98765432\n" +
"code:0192837465\n" +
"password:abc\n" +
"\n" +
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
"some line here\n" +
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
String[] stringParts = inputString.split("\n\n|\r\n\r\n");
inputString = stringParts[0];
System.out.println(inputString)
另一种实现方式是利用扫描仪 class:
String inputString ="URL: www.someurl.com\n" +
"id:12345678\n" +
"dial:+98765432\n" +
"code:0192837465\n" +
"password:abc\n" +
"\n" +
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
"some line here\n" +
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
StringBuilder sb = new StringBuilder();
Scanner scan = new Scanner(inputString);
String line;
while (scan.hasNextLine()) {
line = scan.nextLine();
if (line.equals("")) {
break;
}
sb.append(line).append(System.lineSeparator());
}
inputString = sb.toString().trim();
System.out.println(inputString);
如果您想使用正则表达式(RegEx) 以及作为java.util.regex package 一部分的模式/匹配器类,那么您可以试试这个:
String inputString = "URL: www.someurl.com\n"
+ "id:12345678\n"
+ "dial:+98765432\n"
+ "code:0192837465\n"
+ "password:abc\n"
+ "\n"
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "some line here\n"
+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
Pattern pattern = Pattern.compile("(.*?\n{2}[\r]?)", Pattern.DOTALL);
Matcher m = pattern.matcher(inputString);
String newString = "";
if (m.find()) {
newString = (m.group().trim());
}
System.out.println(newString);
这个正则表达式是什么? - "(.*?\n{2}[\r]?)"
(
: Capturing Group #1 (start) - 将多个令牌组合在一起并创建一个捕获组,用于提取 substring 或使用反向引用。这是指示组开始的左括号。.
: Dot - 匹配除换行符以外的任何字符。*
:量词- 匹配 0 个或多个前面的标记。?
: Lazy - 使前面的量词变得惰性,使其匹配尽可能少的字符。 默认情况下,量词是贪婪的,并且会匹配尽可能多的字符。\n
:转义字符- 匹配 LINE FEED 字符(字符代码 10)。{2}
:量词- 匹配前一个令牌的指定数量。 例如,{1,3} 将匹配 1 到 3。{3} 将完全匹配 3。{3,} 将匹配 3 或更多。[
: Character Set (start) - 匹配集合中的任何字符。 这个开放的方括号开始字符集。\r
:转义字符- 包含在字符集中 - 匹配回车符(字符代码 13)。]
: **Character Set (end) - 匹配集合中的任何字符。 这个右方括号结束了字符集。?
:量词- 匹配前面标记的 0 或 1,有效地使其成为可选。 前面的标记将是字符集中包含的\r
。)
: Capturing Group #1 (end) - 将多个令牌组合在一起并创建一个捕获组,用于提取 substring 或使用反向引用。 这是指示组结束的右括号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.