2015-07-01 68 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