【问题标题】:Java split string by newline regex issue with question markJava拆分字符串由换行正则表达式问题与问号
【发布时间】:2013-02-17 09:03:05
【问题描述】:

我编写了一个 Java 类,它必须从包含换行符的字符串中提取元素。作为第一步,代码必须用换行符分割输入字符串并将结果放入数组中。除了在一种特定情况下,这一切都很好。我正在使用以下代码来执行拆分:

String lines[] = inputText.split("[\\r?\\n\\r]+");

我遇到的问题是以下行:

##INFO=<ID=DS,Number=0,Type=Flag,Description=""removed?"">"

结果是两行:

##INFO=<ID=DS,Number=0,Type=Flag,Description=""removed
"">"

它在问号上分裂。谁能指出我为什么会发生这种情况的正确方向?正则表达式内部没有“?”表示 0 或 1 次出现?这不是换行符分割的可接受方式吗?

【问题讨论】:

  • split('\\n') 不起作用吗?
  • ?确实意味着 0 或 1 但不在 [] 组内,这意味着文字问号,因此你的奇怪结果
  • 可以,但我还必须能够处理 Windows 样式的换行符。我以为我这样写正则表达式是安全的。但可能不会!
  • @BenShirley 您可以查看stackoverflow.com/questions/247059/… 以使其与平台无关?
  • [\n\r]+ 还不够吗?

标签: java regex string split newline


【解决方案1】:

你正在使用一个字符类([]),这意味着括号内的任何字符,所以在你的情况下[\\r?\\n\\r]+,它意味着任何\\r\\n,@987654327 @,\\r,一次或多次(+)

Unicode UTS #18: Unicode Regular Expressions 定义的换行符的真正可移植正则表达式是:

\R => (?:(?>\u000D\u000A)|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])

正如 Perl 名人的 Tom Christiansen 在this answer 中所解释的那样。考虑Java的双重转义(字符串然后正则表达式):

(?:(?>\\u000D\\u000A)|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])

【讨论】:

    【解决方案2】:

    这行得通,只需说 \n\r 或 \n。

    String manyLines = "line1\nline2\n\rline3?\nline4";
    System.out.println(Arrays.asList(manyLines.split("\\n\\r|\\n")));
    

    输出

    [line1, line2, line3?, line4]
    

    【讨论】:

      【解决方案3】:

      方括号内的问号字面意思是一个问号。用圆括号替换方括号(前者限制为每个交替一个字符):

      String lines[] = inputText.split("(\\r?\\n|\\r)+");
      

      行将在“\r\n”、“\n”和“\r”处拆分,但这实际上与以下内容相同:

      String lines[] = inputText.split("(\\n|\\r)+");
      

      所以我们可以回到方括号:

      String lines[] = inputText.split("[\\n\\r]+");
      

      如果您实际需要的是一个恒定的换行符,具体取决于操作系统:

      String lines[] = inputText.split("(" + System.getProperty("line.separator") + ")+");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        相关资源
        最近更新 更多