【问题标题】:Extract some text from beginning of string从字符串的开头提取一些文本
【发布时间】:2018-05-10 12:45:03
【问题描述】:

我坚持要解决这个问题:给定一个字符串,它可能在开头包含一些信息,但这些信息完全是可选的。格式为"//<some text>\n<other text>",其中"//<some text>\n" 是完全可选的,但它很重要。

示例是:"//;\n123""123",在第一个示例中,我想提取 "//;\n""123",而在第二个示例中,我可以使用 "123"

我试过了

"^//(.*)\\n?(.*)$"
"^\\B//(.*)\\n\\B?(.*)$"
"^(//.*\\n)?(.*)$"

但两者都不起作用。你能帮忙吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    你不应该在前半部分使用.*,它可能会“吃掉”\

    您可以使用正则表达式^(//([^\\]*)\\n)?(.*)$

    例子:

    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("^(//([^\\\\]*)\\\\n)?(.*)$");
        Matcher matcher = pattern.matcher("//;\\n123");
        System.out.println(matcher.matches()); //   output: true
        System.out.println(matcher.group(0));  //   output: //;\n123
        System.out.println(matcher.group(1));  //   output:  //;\n
        System.out.println(matcher.group(2));  //   output: ;
        System.out.println(matcher.group(3));  //   output: 123
    }
    

    【讨论】:

    • 谢谢,但我想问一下用这个表达式捕获 group(2) 是否有任何缺点:[^\\]*?
    • @LOUDKING 实际上,您只需要两个反斜杠即可匹配原始字符串中的一个斜杠。但是,您需要另外两个来使编译器编译。见this
    【解决方案2】:

    尝试正则表达式:

    ^"(\/\/.*\\n)?(.*)"
    

    Demo

    说明: (\/\/.*\\n)? 检查以\\ 开头并以\n 结尾的捕获组是否出现0 次或1 次

    (.*) - 第二个捕获组,捕获介于 \n" 之间的所有内容

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多