如何用java regex拆分字符串后面看?

时间:2015-07-01 12:46:47

标签: java regex

我从文件中读取了这个字符串:

  

abc | abc(abc \ | abc)| def

我希望数组中包含3个项目:

  1. ABC
  2. abc(abc \ | abc)
  3. DEF
  4. 如何正确编写正则表达式? line.split("(?!<=\\)\\|")不起作用。

3 个答案:

答案 0 :(得分:2)

<强>代码:

public class __QuickTester {

    public static void main (String [] args) {

        String test = "abc|abc (abc\\|abc)|def|banana\\|apple|orange";

        // \\\\ becomes \\ <-- String
        // \\ becomes \ <-- In Regex
        String[] result = test.split("(?<!\\\\)\\|");

        for(String part : result) {
            System.out.println(part);
        }
    }
}

<强>输出:

abc
abc (abc\|abc)
def
banana\|apple
orange


注意:您需要\\\\(4个反斜杠)才能将\\(2个反斜杠)作为字符串,然后\\(2个反斜杠)在Regex中成为单个\

答案 1 :(得分:0)

试试这个正则表达式:([\w()]|(\\|))+

答案 2 :(得分:0)

您的方法中的主要问题是\在regex中是特殊的,但在String中也是如此。因此,要创建\文字,您需要将其转义两次:

  • in regex \\
  • 字符串"\\\\"中的

因此您需要将其写为split("(?<!\\\\)\\|")

但是这种方法也存在一些问题,因为|上的\分割之前很简单\可能容易出错。因为您使用\作为特殊字符来创建\\文字,所以您可能需要将其编写为c:\foo\bar\,例如创建c:\\foo\\bar\\您可能需要在其中编写它文字为abc|foo\|c:\\bar\\|cde

因此,在这种情况下,我们可以说要分割文本,如

abc|foo\|c:\\bar\\|cde
   ^              ^

我假设你只想在这个地方分开

abc|foo

因为

    |管道\中的
  • 前面没有bar\\|cde
  • \中虽然管道前面有\,但我们知道此|并未用于转义\,而是生成代表{{ 1}}文字(通常为|,其中包含非{偶数\个字符,可以拆分。)

split(onEachPipeWhichHaveBackslashBeforeIt)split("(?<!\\\\)\\|") bar\\|cde不同,因为在\之前|会阻止此类分割,因此\之间不会分开|

要解决这个问题,你可以检查split("(?<!(?<!\\\\)((\\\\){2}){0,1000}\\\\)\\|")之前是否有奇数1000,但这在Java中很难做到,因为后视需要有限的宽度。

可能的解决方案是\并假设字符串永远不会包含超过|个连续\个字符,但它似乎有点过分。

IMO更好的解决方案是搜索您想要查找的字符串,而不是搜索您想要拆分的字符串。你要找的字符串是

  • |
  • 以外的所有字符
  • 所有以\开头的字符(包括(\\\\.|[^|])+ \\\\.以后只会逃避它。)

因此,我们的正则表达式看起来像[^|](我在开始时放置\以阻止Pattern p = Pattern.compile("(\\\\.|[^|])+"); Matcher m = p.matcher(text); while (m.find()){ System.out.println(m.group()); } 使用abc foo\|c:\\bar\\ cde 消耗 $.ajax({ url: "rest/api/crunchifyService/jsonpost", method: "POST", data: JSON.stringify(jsonObj), dataType: 'json', contentType: "application/json", success: function(result,status,jqXHR ){ //Do something }, error(jqXHR, textStatus, errorThrown){ //Do something } }); ,这将用于转义其他字符。)

示例:

<servlet>
    <servlet-name>proxy</servlet-name>
    <servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
    <init-param>
        <param-name>targetUri</param-name>
        <param-value><!-- Cross domain URL goes here --></param-value>
    </init-param>
    <init-param>
        <param-name>log</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>proxy</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

输出:

{{1}}