2014-12-21 4 views
3

Я хочу помочь с регулярными выражениями для решения следующей задачи:Расщепление на нескольких разделителей, но сохранить разделителей на той же строке

У меня есть строка, такие как «1 £ 23 $ 456 $ £ $»

когда я разделил на ней я хочу выход в моем строковом массиве содержит:

1£ 
23$ 
456$ 
£ 
$ 

Кто-нибудь есть какие-либо идеи о том, как лучше решить эту проблему? Решение должно соответствовать этим дополнительным требованиям:

  1. также разделить на разделители символов: +, -, * и /
  2. Non-разделители символов являются только цифры с пробелами или до ограничителей.
  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. Non-разделителей символы являются только цифры с пробелами или до ограничителей.
  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

похоже, что у него есть проблема с регулярным выражением, которое вы используете, или больше с точки зрения недействительной escape-последовательности. – user1383163

+0

@ user1383163 Да, исправлено в редактировании. –

+0

Спасибо, поэтому я добавил + - * /, который дал мне \\ d * (\\ $ | £ | - | \\ + | \\ * | /), но это кажется неправильным, можете ли вы подтвердить, что i я ошибаюсь – 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$, £, $] 
Смежные вопросы