2011-02-03 2 views
0

У меня проблема, когда мне нужно tokenize мою строку (используя код Java), чтобы она была разделена на массив строк. Каждый маркер в этом массиве должно быть либо слово, число или размеры формы (23 х 34 х 56 и т.д.) я пытался кодировать это как:регулярные выражения в java

String[] split_text = text.split("\\s | (\\d{3},)*\\d{3}([.]\\d)* x (\\d{3},)*\\d{3}([.]\\d)* | \\d*([.]\\d)* x \\d*([.]\\d)*"); 

Но это дает ошибку синтаксиса. Может кто-нибудь, пожалуйста, скажите мне, как я могу это сделать, используя регулярные выражения, и есть ли проблема в том, как я выражал регулярное выражение в java?

+0

Вы также можете разместить образец ввода и ожидаемый выход. –

+2

Просто подсказка: вставьте свое регулярное выражение в http://www.strfriend.com/, чтобы визуализировать его графически. Помогает мне много времени от времени. –

+1

@Rodrigo: Эта ссылка в высшей степени удивительна; +1 –

ответ

1

Для сопоставления любой пары чисел с точками или запятыми и x в середине вы могли бы сделать что-то вроде этого:

(\d*(?:[.,]\d+)* x \d*(?:[.,]\d+)*) 

или для пар и троек:

(\d*(?:[.,]\d+)*(?: x \d*(?:[.,]\d+)*){1,2}) 

так, может быть, вот ваше выражение:

((?:\d*(?:[.,]\d+)*(?: x \d*(?:[.,]\d+)*){1,2})|\s|\w+) 

См. Здесь: http://rubular.com/r/snAiI7GMT7 - отличный сайт для тестирования.

Возможно, вы захотите заменить \w на \p{L}, чтобы охватить все слова юникода в java.

+0

спасибо! его просто нужно изменить, чтобы включить дополнительное ограничение, которое запятая должна быть после каждой третьей цифры. – assassin

0

String.split возвращает массив строк.

Сделать split_text массив:

String[] split_text = ... 
     ^^ 
+0

Извините за опечатку раньше ... split_text - это массив. – assassin

0

Я не вижу синтаксическую ошибку в своем регулярном выражении, но есть несколько проблем:

  • Пробелы является значение в регулярном выражении, поэтому не помещайте пробелы в регулярное выражение, где вы не ожидаете их в строке.
  • Используйте \., чтобы соответствовать буквальной точке.
  • (\d{3},)*\d{3}([.]\\d)* будет соответствовать 123,456,789.1.1.1.1, но не 1,234.67. Это действительно то, что вы намеревались?
  • <number> x <number> будет соответствовать только парам чисел, а не триплетам, как в вашем примере.

Я думаю, что это лучше, если вы немного уточните свои спецификации. То, что точно вы/вы не хотите совпадать. Приведите несколько примеров. Подумайте о углах (допустим, что начальный ноль разрешен?) Можно ли его отбросить, как в .12? Как насчет 1.4E-45 и т. Д.)

+0

большое спасибо ... да, я хочу совместить пробелы и размеры формы 23.345 x 25.455 x 9032.232 или 234,232 x 234,2343 (включая пробелы). Начальный ноль разрешен, а также может быть опущен в случае .12. Итак, это в основном самый общий случай. – assassin

+0

также, не хочу соответствовать 1.4E-45 – assassin

+0

Таким образом, разделитель тысяч не является обязательным? Вы хотите, чтобы регулярное выражение выполняло проверку, находится ли оно в правильном месте или можно предположить, что оно будет, поэтому проверка не требуется? –

Смежные вопросы