2014-12-21 39 views
3

我想用正则表达式来解决以下问题有所帮助:分割在多个分隔符,但保持分隔符上相同的字符串

我有一个字符串,如“1£23 $ 456 $£$”

当我劈在这我想在我的字符串数组输出包含:

1£ 
23$ 
456$ 
£ 
$ 

人对如何最好地解决这个问题的任何想法?该解决方案需要满足这些额外的要求:

  1. 也被分成上分隔符:+-*/
  2. 非分隔符仅与分隔符之前可选的空间位。
  3. 任何这样的空间都是价值的一部分,而不是分隔符本身。
+0

是井号和美元符号,将永远在你输入的字符串被发现,或者是其他的只有两个分隔符分隔符可能?一个好的正则表达式只能在知道输入的限制时才制作。 – Bobulous

回答

3

使用功能更强大的Matcher功能代替String.split。下面的代码应该工作,但一直没有得到优化:

Pattern pattern = Pattern.compile("\\d*(\\$|£)"); 

String input = "1£23$456$£$"; 
Matcher matcher = pattern.matcher(input); 
List<String> output = new ArrayList<>(); 
while (matcher.find()) { 
    output.add(matcher.group()); 
} 

打印出来output.toString()产生:

[1£, 23$, 456$, £, $]


更新的要求:

  1. 还包括分隔符字符:+,-,*/
  2. 非分隔字符只是在分隔符之前带有可选空格的数字。
  3. 任何这样的空间都是价值的一部分,而不是分隔符本身。

使用正则表达式:\\d*\\s*[-\\+\\*/\\$£]

这种模式,这个给定的输入:

1£23$456$£$7+89-1011*121314/1 £23 $456 $ £ $7 +89 -1011 * 121314 /

就会产生此输出:

[1£, 23$, 456$, £, $, 7+, 89-, 1011*, 121314/, 1 £, 23 $, 456 $, £, $, 7 +, 89 -, 1011 *, 121314 /]

+0

看起来有和你正在使用或更重要的是一个无效的转义序列正则表达式的问题。 – user1383163

+0

@ user1383163是,固定编辑。 –

+0

感谢,所以我说+ - * /以及这给了我\\ d *(\\ $ |£| - | \\ + | \\ * | /),但是这似乎是错的,你能确定,如果我我犯了一个错误 – user1383163

0

你可能想这

Matcher m = Pattern.compile("[^$£]*(\\$|£)").matcher(input); 
+0

不该该是'[^ $£] *(\ $ |£)' – artm

2

使用一看后面,这是不消耗:

String[] parts = str.split("(?<=\\D)"); 

这一切就是这么简单。正则表达式意味着将“每个非数字之后”分开,这似乎完全是您的意图。


一些测试代码:

String str = "1£23$456$£$"; 
String[] parts = str.split("(?<=\\D)"); 
System.out.println(Arrays.toString(parts)); 

输出:

[1£, 23$, 456$, £, $] 
相关问题