Объединить два шаблона в один - PullRequest
3 голосов
/ 19 июня 2019

Мне нужно написать шаблон для удаления символа валюты и запятой.например, Fr.-145,000.01 После того, как сопоставитель шаблонов должен вернуть -145000.01.

Шаблон, который я использую:

^[^0-9\\-]*([0-9\\-\\.\\,]*?)[^0-9\\-]*$

Это вернет -145,000.01

Затем я удаляюзапятую, чтобы получить -145000.01, я хочу спросить, возможно ли, чтобы я изменил шаблон и сразу получил -145000.01

String pattern = "^[^0-9\\-]*([0-9\\-\\.\\,]*?)[^0-9\\-]*$";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(str);
if(m.matches()) {
 System.out.println(m.group(1));
}

Я ожидаю, что вывод может разрешить запятую

Ответы [ 5 ]

1 голос
/ 19 июня 2019

Вы можете использовать 2 группы захвата и использовать повторяющееся сопоставление, используя якорь \G для подтверждения позиции в конце предыдущего совпадения.

(?:^[^0-9+-]+(?=[.+,\d-]*\.\d+$)([+-]?\d{1,3})|\G(?!^)),(\d{3})

В Java

String regex = "(?:^[^0-9+-]+(?=[.+,\\d-]*\\.\\d+$)([+-]?\\d{1,3})|\\G(?!^)),(\\d{3})";

Пояснение

  • (?: Группа без захвата
  • ^[^0-9+-]+ Совпадение 1+ раз, а не цифра, + или -
  • (?= Позитивный взгляд, утверждают, что следующее:
    • [.+,\d-]*\.\d+$ Совпадение 0+ раз, что разрешено, и утверждение заканчивается на . и 1+ цифрах
  • ) Закрыть положительный прогноз
  • ( Группа захвата 1
    • [+-]?\d{1,3}) Совпадение необязательно + или -, за которым следуют 1-3 цифры
    • | Или
    • \G(?!^) Подтвердить позицию в конце предыдущего матча, а не в начале
  • ), Закрыть группу захвата 1 и сопоставить,
  • (\d{3}) Захват в группе 2, совпадающий с 3 цифрами

При замене используйте 2 группы захвата $1$2

См. Regex demо | Java демо

1 голос
/ 19 июня 2019

Вы можете просто сделать это с помощью String.replaceAll() и более простого регулярного выражения (при условии, что вы ожидаете, что ввод будет разумным, т. Е. Без нескольких десятичных знаков, встроенных в числа или нескольких отрицательных знаков)

   String str = "Fr.-145,000.01";
   str.replaceAll("[^\\d-.]\\.?", "")

Есливы идете по этому маршруту, я бы исправно проверил его, проанализировав результат с BigDecimal или Double.

1 голос
/ 19 июня 2019
String str = "Fr.-145,000.01";

Pattern regex = Pattern.compile("^[^0-9-]*(-?[0-9]+)(?:,([0-9]{3}))?(?:,([0-9]{3}))?(?:,([0-9]{3}))?(\\.[0-9]+)?[^0-9-]*$");
Matcher matcher = regex.matcher(str);
System.out.println(matcher.replaceAll("$1$2$3$4$5"));

Вывод:

-145000.01

Он ищет число до 3 запятых (до 999 999 999 999,99) и заменяет его цифрами.

1 голос
/ 19 июня 2019

Мой подход состоит в том, чтобы удалить все ненужные детали, используя replaceAll.

Ненужные части, по-видимому:

  1. Любая последовательность, которая не является цифрой или минусом в начале строки.
  2. Запятые

Первый шаблон представлен ^[^\\d-]+. Второй просто ,.

Соедините их вместе с |:

Pattern p = Pattern.compile("(^[^\\d-]+)|,");
Matcher m = p.matcher(str);
String result = m.replaceAll("");
1 голос
/ 19 июня 2019

Один из подходов состоит в том, чтобы просто собрать нужные цифры, ., + и - в группе захвата, за которой следует необязательная запятая, и затем присоединить их:

([+-]?[0-9][0-9.]+),?

Test

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "([+-]?[0-9][0-9.]+),?";
final String string = "Fr.-145,000.01\n"
     + "Fr.-145,000\n"
     + "Fr.-145,000,000\n"
     + "Fr.-145\n"
     + "Fr.+145,000.01\n"
     + "Fr.+145,000\n"
     + "Fr.145,000,000\n"
     + "Fr.145\n"
     + "Fr.145,000,000,000.01";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...