регулярные выражения в Java - PullRequest
0 голосов
/ 03 февраля 2011

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

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

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

Ответы [ 3 ]

1 голос
/ 03 февраля 2011

Чтобы сопоставить любую пару чисел точками или запятыми и крестиком в середине, вы можете сделать что-то вроде этого:

(\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 голосов
/ 03 февраля 2011

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

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

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

0 голосов
/ 03 февраля 2011

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

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

String[] split_text = ...
      ^^
...