2015-07-01 67 views
5

我从文件中读取这个字符串:如何通过Java正则表达式分割字符串与后面看?

abc |美国广播公司(ABC \ | ABC)| DEF

我想阵列inludes 3项:

  1. ABC
  2. 广播公司(ABC \ | ABC)
  3. 高清

如何正确写入正则表达式? line.split("(?!<=\\)\\|")不起作用。

+0

什么是你的分裂状态?在它之前的“|”里面是否包含“'''”的括号或'|'?你的字符串也可以是'abc \ | abc | (ab | ab)'?甚至是'ab \\ | ab \ | ab'?如果是的话,你会如何分裂它? – Pshemo

+0

看起来像你只需要通过|分割字符。如果这是你想要的,你可以使用String [] splitedArray = str.split(“\\ |”); –

+0

@RamanShrivastava事情并不那么简单。另外OP已经在'\\ |'上分裂了。 – Pshemo

回答

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中成为一个单独的\

+0

但字符串可以inculde“abc | abc”,我更新我的帖子 – mystdeim

+0

@mystdeim现在没有空格,它的工作原理!我认为现在是正确的。 :) – Gosu

0

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

0

在你的方法主要问题是\是在正则表达式特殊,而且在字符串。因此,要建立\文字,你需要转义两次:

  • 在正则表达式\\
  • 在字符串"\\\\"

所以你需要把它写为split("(?<!\\\\)\\|")

但也有因为使用这种拆分方法上|这是简单的由\之前可容易出错可能出现的问题。因为您使用\作为特殊字符来创建\文字,所以您可能需要将其编写为\\,例如创建c:\foo\bar\,您可能需要将其写入文本中作为c:\\foo\\bar\\

因此,在这种情况下,可以说,要像

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

拆分文本我假设你要分割只有在这个地方

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

因为

  • abc|foo pipe |在它之前没有\
  • bar\\|cde
  • 尽管有\前管,我们知道这\不是用来逃跑|,但以产生代表\文字(所以一般|具有非或偶数\字符是OK拆分文本)。

split(onEachPipeWhichHaveBackslashBeforeIt)split("(?<!\\\\)\\|")因为\|这将避免这种分裂之前,你不会bar\\|cde之间的分裂。

为了解决这个问题,你可以检查|之前是否有奇数的\,但是这在Java中很难做到,因为后视需要限制宽度。

可能的解决方案将是split("(?<!(?<!\\\\)((\\\\){2}){0,1000}\\\\)\\|")和假设字符串将永远不会包含超过1000连续\字符,但它似乎是矫枉过正。

国际海事组织更好的解决方案将搜索想要找到的字符串,而不是搜索想要分裂的字符串。你想找到字符串

  • 所有字符除了|
  • 它们由\之前的所有字符(包括|因为\就干脆逃跑吧)。

所以我们的正则表达式可能看起来像(\\\\.|[^|])+(我放在\\\\.在启动防止[^|]消费\将被用来逃避其他字符)。

例子:

Pattern p = Pattern.compile("(\\\\.|[^|])+"); 
Matcher m = p.matcher(text); 
while (m.find()){ 
    System.out.println(m.group()); 
} 

输出:

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