2010-03-09 14 views
3
System.out.println(
    Arrays.deepToString(
     "abc<def>ghi".split("(?:<)|(?:>)") 
    ) 
); 

這打印[abc, def, ghi],就好像我在"<|>"上分割一樣。我想要它打印[abc, <def>, ghi]。有沒有辦法用一些正則表達式來實現我想要的東西?你可以在字符串拆分中使用零寬度匹配正則表達式嗎?


也許一個簡單的例子:

System.out.println(
    Arrays.deepToString(
     "Hello! Oh my!! Good bye!!".split("(?:!+)") 
    ) 
); 

這將打印[Hello, Oh my, Good bye]。我想要它打印[Hello!, Oh my!!, Good bye!!]。 `。

+0

重複的http://stackoverflow.com/questions/275768/is-there-a-way-to-split-strings-with-string-split-and-include-the-delimiters – danben 2010-03-09 04:25:02

回答

0

由於信息來自電影,我認爲這些都是我在尋找的答案:

System.out.println(
    Arrays.deepToString(
     "abc<def>ghi<x><x>".split("(?=<)|(?<=>)") 
    ) 
); // [abc, <def>, ghi, <x>, <x>] 


System.out.println(
    Arrays.deepToString(
     "Hello! Oh my!! Good bye!! IT WORKS!!!".split("(?<=!++)") 
    ) 
); // [Hello!, Oh my!!, Good bye!!, IT WORKS!!!] 

現在,第二個是通過對所有不同的量詞進行實驗來真實地發現的。既不貪心也不願意工作,但佔有慾。

我還不確定爲什麼。

+2

你的第二個例子不應該工作。 : - /它應該拋出一個PatternSyntaxException,因爲lookbehind沒有明顯的最大長度。你的正則表達式編譯是一個錯誤;它*起作用*是令人難以置信的 - 而不是依靠。這是你應該使用的:'(?<=!)(?!!)'。這將支持任何支持lookaheads和lookbeheads的正則表達式。 – 2010-03-09 06:50:41

+0

「你的正則表達式編譯是一個錯誤」....所以,我們該怎麼做呢? – polygenelubricants 2010-03-09 07:03:32

+2

這個錯誤已經被報道,如果這就是你的意思。我建議你不要養成在任何情況下都會在lookbehinds中使用可變寬度表達式的習慣;很少有正則表達式支持該功能,反正通常有更好的方法。 – 2010-03-09 07:18:48

1

您可以使用\b(字邊界)作爲尋找的零寬度,並將其用作尋找<>的錨點。

String s = "abc<def>ghi"; 
String[] bits = s.split("(?<=>)\\b|\\b(?=<)"); 
for (String bit : bits) { 
    System.out.println(bit); 
} 

輸出:

abc 
<def> 
ghi 

現在這不是一個通用的解決方案。您可能需要爲此編寫自定義拆分方法。

你的第二個例子表明你並不是真的split(),而是一個正則表達式匹配循環。例如:

String s = "Hello! Oh my!! Good bye!!"; 
Pattern p = Pattern.compile("(.*?!+)\\s*"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println("[" + m.group(1) + "]"); 
} 

輸出:

[Hello!] 
[Oh my!!] 
[Good bye!!] 
+0

您好嗎評論我的回答看看是否有什麼問題?謝謝。 – polygenelubricants 2010-03-09 05:36:28

3

你需要看一看零層寬度匹配結構:

(?=X) X, via zero-width positive lookahead 
(?!X) X, via zero-width negative lookahead 
(?<=X) X, via zero-width positive lookbehind 
(?<!X) X, via zero-width negative lookbehind 
+0

是的,我誤解了'(?:'...')'的用途。 – polygenelubricants 2010-03-09 05:09:02

相關問題