我從文件中讀取這個字符串:如何通過Java正則表達式分割字符串與後面看?
abc |美國廣播公司(ABC \ | ABC)| DEF
我想陣列inludes 3項:
- ABC
- 廣播公司(ABC \ | ABC)
- 高清
如何正確寫入正則表達式? line.split("(?!<=\\)\\|")
不起作用。
我從文件中讀取這個字符串:如何通過Java正則表達式分割字符串與後面看?
abc |美國廣播公司(ABC \ | ABC)| DEF
我想陣列inludes 3項:
如何正確寫入正則表達式? line.split("(?!<=\\)\\|")
不起作用。
代碼:
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中成爲一個單獨的\
。
試試這個正則表達式:([\w()]|(\\|))+
在你的方法主要問題是\
是在正則表達式特殊,而且在字符串。因此,要建立\
文字,你需要轉義兩次:
\\
"\\\\"
。所以你需要把它寫爲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
什麼是你的分裂狀態?在它之前的「|」裏面是否包含「'''」的括號或'|'?你的字符串也可以是'abc \ | abc | (ab | ab)'?甚至是'ab \\ | ab \ | ab'?如果是的話,你會如何分裂它? – Pshemo
看起來像你只需要通過|分割字符。如果這是你想要的,你可以使用String [] splitedArray = str.split(「\\ |」); –
@RamanShrivastava事情並不那麼簡單。另外OP已經在'\\ |'上分裂了。 – Pshemo