2016-09-29 113 views
0

我想分割的字符串如下所示。如何在java中分割字符串?

String text = " *Some text* *Another text* *Yet another text*  **last text**"; 

我需要拆分上面的字符串,以便我可以得到像下面这样的数组。

String[] array = {"Some text", "Another text", "Yet another text", "last text"} 

如果你注意到,前三个文本有星号(*)在他们身边,而最后一个周围有两个星号。

此外,文本之间可以有空格,例如。 *Some text*

会有不文本和*

例如之间的任何空间*Text* - will happen

* some text * - will not happen 

谁能帮助,因为我不知道正则表达式的那么多。

+0

那么,会不会有'String text =“* Some \\ * text *”'?或者'String text =“* .Some text。*”'?只是为了确认:界限是'space' +'*'+'non-space' ...'non-space' +'*'+'space' –

+0

@WiktorStribiżew单个星号将围绕每个文本。双星号将仅包围最后一个文本。文本或任何其他特殊字符之间不会有其他星号。文本的数量可以像一两个不同。在这种情况下,最后一段文字总是有两个星号。 – ashishjmeshram

+0

为什么downvote? – ashishjmeshram

回答

1

以下是你的问题推导出的规格和评论:

  • 初始*应遵循的字字符(字母/数字/下划线)
  • 尾随*应该用字字符
  • 前面非字字符后星号或字符串和befo开始 -

您可以使用单纯的"\\B\\*\\b([^*]+)\\b\\*\\B"模式断言星号(\\B\\*\\b的预期位置再一个字字符,并\\b\\*\\B - 串的非字字符/结束一个字字符之前和之后的星号),和抓住1个或多个字符比*其它成组1.

String s = " *Some text* *Another text* *Yet another text*  **last text**"; 
Pattern pattern = Pattern.compile("\\B\\*\\b([^*]+)\\b\\*\\B"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(1)); 
} 

一个更复杂的变化,以仅检查星号随后/之前或不与空格(start|space + * + non-space + any_chars_not_parens + non-space + * + space|end)可以是

"(?<!\\S)\\*(?!\\s)([^*]+)(?<!\\s)\\*(?!\\S)" 

参见another Java demo