Отдельные данные запятыми - PullRequest
       25

Отдельные данные запятыми

1 голос
/ 26 сентября 2011

Я изучаю RegEx. полностью новичок: P

Я хотел отделить числа от приведенных ниже данных, которые разделяются только запятой

test
t,b
45,49
31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,
,
.
.,/;,jm.m.,,n ,sdsd, 3,2m54,2 4,2m,ar ,SSD A,,B,4D,CE,S4,D,2343ES,SD

Предположим, я получаю вышеуказанные данные из текстового поля формы. Теперь я хочу читать только те данные, которые разделены запятой

Решение должно быть [строка]

45,49,31,34,38,34,56,23,3,23,23653,3875

все остальные данные должны быть пропущены. Я пробовал что-то вроде этого ^ [0-9] + \, $

Но он также выбирает 7 из 3,7 и 5 из 8,5 и т. Д.

Может кто-нибудь помочь мне в решении этого вопроса *

Ответы [ 3 ]

0 голосов
/ 26 сентября 2011

Самое короткое решение, которое я мог бы придумать, это заменить что-либо, кроме набора чисел, разделенных запятыми, на пустую строку. Таким образом, вы можете сделать s.replaceAll("[^0-9]*,", ",") Если у вас есть случайные символы новой строки, вы, вероятно, захотите добавить s.replaceAll("\n", ","). Затем, после этих преобразований, вы можете просто сделать то, что предложено, и разделить запятыми.

0 голосов
/ 26 сентября 2011

этот эксперимент даст вам все нужные вам цифры (только цифры, без запятых).

"^\d+|(?<=,)\d+$|(?<=,)\d+(?=,)"

см. Пример grep:

kent$  echo "31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,
"|grep -oP "^\d+|(?<=,)\d+$|(?<=,)\d+(?=,)"

31
34
38
34
56
23
3
23
23653
3875
0 голосов
/ 26 сентября 2011

Предполагая, что вы уже разделяете запятые и пытаетесь проверить, являются ли полученные элементы числами, используйте это выражение: ^\d+(?:\.\d+)?$, что означает: «должно начинаться с цифр, за которыми может следовать точка и хотя бы еще одна цифра»,

Это будет соответствовать 31, а также 7.8, но не 2., 6 6 6 6 или 2m54.

Ниже приведено объяснение этого выражения по частям:

  • ^ означает: совпадения должны начинаться с первого символа
  • $ означает: совпадения должны заканчиваться последним символом, поэтому оба вместе означают, что вся строка должна совпадать
  • \d+ означает: одна или несколько цифр
  • (?: ... ) - это группа без захвата, позволяющая применить квантификатор ?
  • \. означает: буквальная точка
  • (?:\.\d+)?, таким образом, означает: ноль или один вхождения точки, за которой следует хотя бы одна цифра

Редактировать: если вам нужны только целые числа, просто удалите группу: ^\d+$ -> весь ввод должен состоять из одной или нескольких цифр.

Редактировать 2: Если вы можете добавить и добавить запятую к строке ввода (см. Редактировать 4), вы сможетеиспользуйте это регулярное выражение для получения всех чисел: (?<=,)\s*(\d+(?:\.\d+)?)\s*(?=,) (только для целых чисел потребуется удалить часть (?:\.\d+)?).

Это выражение получает все числа между двумя запятыми с возможными пробелами между запятыми и номером и захватывает число в группу.Это должно предотвратить совпадения 6 6 6 6 или 2m54.Затем просто переберите совпадения, чтобы получить все группы.

Редактировать 3: Вот пример с вашей входной строкой.

String input = "test\n" +
        "t,b\n" +
        "45,49\n" +
        "31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,\n" +
        ",\n" +
        ".\n" +
        ".,/;,jm.m.,,n ,sdsd, 3,2m54,2 4,2m,ar ,SSD A,,B,4D,CE,S4,D,2343ES,SD\n";

Pattern p = Pattern.compile( "(?<=,|\\n)\\s*(\\d+(?:\\.\\d+)?)\\s*(?=,|\\n)" );    

Matcher m = p.matcher( input );

List<String> numbers = new ArrayList<String>();

while(m.find())
{
  numbers.add( m.group( 1 ) );
}

System.out.println(Arrays.toString( numbers.toArray() ));

//prints: [45, 49, 31, 34, 38, 34, 56, 23, 3, 23, 23653, 3875, 3.7, 8.5, 2.5, 7.8, 3]
//removing the faction group: [45, 49, 31, 34, 38, 34, 56, 23, 3, 23, 23653, 3875, 3]

Редактировать 4: на самом деле, вам не нужно добавлятьзапятые, просто используйте это выражение:

`(?<=,|\n|^)\s*(\d+)\s*(?=,|\n|$)`

Группы в начале и конце означают, что совпадение должно следовать за началом ввода, запятой или переводом строки и сопровождаться концом ввода,запятая или разрыв строки.

...