繁体   English   中英

Java Substring 来自多行字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM