簡體   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