【问题标题】:Java Substring from multiline string来自多行字符串的 Java 子字符串
【发布时间】:2020-05-19 07:10:47
【问题描述】:

我有一个要求是编辑字符串并显示

输入字符串:

邀请网址:www.someurl.com id:12345678 拨号:+98765432 代码:0192837465 访问代码:12345 密码:abc

这里有一行

我不想显示最后 3 行,

我试图搜索空行的索引并获取从索引0到空行索引的子字符串

int index = mystring.indexof(("\\r\\n")); 

mystring.substring(0,index)

但是索引总是返回-1。我的疑问是如何找到空字符串的索引。

我想要来自 InviteURL 的子字符串,直到 AccessCode 或 Password(AccessCode 和 Password 都存在或只存在 AccessCode),之后我必须跳过任何其他附加行

预期输出:

邀请网址:www.someurl.com id:12345678

拨号:+98765432

代码:0192837465

密码:abc

【问题讨论】:

  • 将所有行读入 ArrayList 变量,然后循环直到长度 - 3?
  • 使用String.trim()String.strip(),或仅Streams.lines过滤最后3行
  • int index = mystring.indexof(("\\r\\n")); 代替 int index = mystring.indexof(("\\n\\n"));

标签: java substring


【解决方案1】:

有很多方法可以做到这一点,但最简单的是最有可能的:

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)

另外一种实现方式是利用 Scanner 类:

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);

如果你想使用 Regular Expression (RegEx) 和 Pattern/Matcher 类,它是 java.util.regex 包的一部分,那么你可以试试这个:

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) - 将多个令牌组合在一起并 创建一个捕获组以提取子字符串或使用 反向引用。这是指示组开始的左括号。
  • . : - 匹配任何字符除了换行符。
  • * : Quantifier - 匹配 0 个或多个前面的标记。
  • ? : Lazy - 使前面的量词变得惰性,导致它 匹配尽可能少的字符。默认情况下,量词是 贪婪,并且会匹配尽可能多的字符。
  • \n : 转义字符 - 匹配 LINE FEED 字符(char 代码 10)。
  • {2} : Quantifier - 匹配指定数量的 以前的令牌。例如,{1,3} 将匹配 1 到 3。{3} 将匹配 正好 3。{3,} 将匹配 3 或更多。
  • [字符集(开始) - 匹配集中的任何字符。这个开 方括号开始字符集。
  • \r: 转义字符 - 包含在字符集中 - 匹配回车字符(字符代码 13)。
  • ] : **字符集(结束)-匹配集中的任何字符。这 close 方括号结束字符集。
  • ? : Quantifier - 匹配前面标记的 0 或 1, 有效地使其成为可选。前面的标记是\r 包含在字符集中。
  • ) : Capturing Group #1 (end) - 将多个令牌组合在一起 并创建一个捕获组以提取子字符串或使用 反向引用。这是表示结束的右括号 组。

【讨论】:

  • String inputString = "URL: www.someurl.com\n" + "id:12345678\n" + "dial:+98765432\n" + "code:0192837465\n" + "AccessCode :123456\n" + "密码:abc\n" + "\n" + "~~~~~~\n" + "这里有一行\n" + "~~~~~~";这里要么同时存在 AccessCode 和 Password ,要么只存在 AccecssCode 。我需要将子字符串从 "URL: www.someurl.com" 提取到 AccessCode/Password 。这种情况如何处理
【解决方案2】:
    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]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多