2014-08-28 238 views
2

我有這個字符串:「你好,我的名字是[[Peter.java]]。」Java正則表達式,分割字符串在標點符號除括號外

所需的分割是:你好,我,名稱,是,[Peter.java]]]

我處裂開punktuation痕跡,但完全地忽視了這些括號的東西。

我想:

​​

但這並不工作,因爲輸出爲[你好,我的,名稱爲,[彼得,爪哇]]]。你可以幫我嗎?

其他例子:

"Hello. My name is [[Peter.java]]" --> [Hello, My, name, is, [[Peter.java]]] 

"Hi. How, [[are,you]]" --> [Hi, How, [[are,you]]] 
+0

它需要是一個正則表達式嗎?在你的情況下,它會更容易做到另一種方式... – msrd0 2014-08-28 20:21:14

回答

1

你可以使用這個表達式拆分:

[.,\s]+(?!\w+]) 

Working demo

enter image description here

代碼

public void testRegex() { 
    String str = "Hello. my Name is [[Peter.java]]."; 

    String[] arr = str.split("[.,\\s]+(?!\\w+])"); 

    System.out.println(Arrays.toString(arr)); 
} 
// Output: [Hello, my, Name, is, [[Peter.java]]] 

編輯:爲HamZa指出在他的評論中,正則表達式上面的失敗是字符串是something, like this]。因此,利用的使用SKIP &失敗 PCRE功能,此正則表達式可以通過使用改進:

\[\[.*?\]\]  # Match our brackets 
(*SKIP)(*FAIL) # Skip that match and proceed further 
|    # or 
[\s.,]+   # any character of: whitespace (\n, \r, \t, 
         \f, and " "), '.', ',' (1 or more times) 

Working demo

+0

可悲的是我不能使用這個,因爲我發佈的字符串只是一個例子。如果它在這些括號中,我必須在每個空格/標點符號處分割。例如「Hello。I [[am.Peter]]」。「 - > [你好,我,[[am.Peter]]] – Peter111 2014-08-28 20:12:55

+1

@ Peter111檢查此鏈接http://regex101.com/r/hS1wF5/3。它工作嗎? – 2014-08-28 20:22:43

+0

是的,你太棒了 – Peter111 2014-08-28 20:28:27

1

而不是使用String.split,你可能會想使用不同的正則表達式。

/\[\[(.*?)\]\]|(\w+)\W/g

Online demo

然後用匹配通過比賽進行迭代。

+0

[足夠接近...](http://regex101.com/r/kS8qJ4/1),我建議在編寫代碼時保持一致。這不是一些codegolf/obfuscating挑戰。所以你要麼使用'\ [{2}'和'\] {2}',要麼使用'\ [\ ['和'\] \]'。 – HamZa 2014-08-28 20:28:44

+0

如果在括號序列中添加了一個緊密括號,則會中斷。 http://regex101.com/r/cZ2eD5/1 – Strikeskids 2014-08-28 20:31:24

+0

對,我傾向於避免'。*?'出於以下幾個原因。我們可以通過使用否定字符類來提高性能。它也不符合不帶's'修飾符的換行符。最後一個原因可能是所期望的效果,這是大多數時候在SO問題中不清楚的問題:) – HamZa 2014-08-28 20:33:30

相關問題