Как я могу сопоставить десятичное значение с запятой и круглыми скобками в регулярном выражении? - PullRequest
0 голосов
/ 29 апреля 2020

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

  Tst:      (2344.45)
    Tst:      53.00
    Tst:     2777,46.00

o/p should be 
    Tst: (2344.45)
    Tst: 53.00
    Tst: 2777,46.00

Мне нужно удалить пробелы после Tst. Чтобы сопоставить запятую и десятичную точку, я использовал ниже регулярное выражение.

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

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

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

Любая подсказка по этому вопросу будет полезна. Я хочу чтобы достичь этого в java

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

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

Подберите 1 или более горизонтальных пробельных символов между ними и замените их на один пробел.

Шаблон

(\w+:)\h+((?:\(\d+(?:,\d+)*(?:\.\d+)?\)|\d+(?:,\d+)*(?:\.\d+)?))

Объяснение

  • (\w+:) Захват группа 1 , соответствует 1+ словам символов и :
  • \h+ Соответствует 1+ горизонтальным пробелам
  • ( Захват группа 2
    • (?: Группа без захвата
    • \(\d+(?:,\d+)*(?:\.\d+)?\) Совпадение числовой части с ( и )
    • | Или
    • \d+(?:,\d+)*(?:\.\d+)?) Соответствие номер части без круглых скобок
  • ) Закрыть группу групп без захвата

Regex demo | Java демо

Заменить на

$1 $2

Пример кода

String regex = "(\\w+:)\\h+((?:\\(\\d+(?:,\\d+)*(?:\\.\\d+)?\\)|\\d+(?:,\\d+)*(?:\\.\\d+)?))";
String string = "Tst:      (2344.45)\n"
     + "Tst:      53.00\n"
     + "Tst:     2777,46.00";
String subst = "$1 $2";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
System.out.printlnmatcher.replaceAll(subst);

Выходные данные

Tst: (2344.45)
Tst: 53.00
Tst: 2777,46.00

Если вы хотите сопоставить несколько :, вы можете использовать квантификатор (обратите внимание, что двойные экранированные обратные слэши в Java)

(\w+:+)\h+((?:\(\d+(?:,\d+)*(?:\.\d+)?\)|\d+(?:,\d+)*(?:\.\d+)?))

Regex demo

0 голосов
/ 29 апреля 2020

Попробуйте с этим регулярным выражением: \s*(\w+):\s*(\(?)(\d[\d,]*(\.[\d]+)?)(\)?)

Если вы игнорируете текст, попробуйте только с этим: (\(?)(\d[\d,]*(\.[\d]+)?)(\)?)

Демо здесь

Java код здесь:

Pattern p = Pattern.compile("\\s*(\\S+)\\s*(\\(?)(\\d[\\d,]*(\\.[\\d]+)?)(\\)?)");
        List<String> inputs = Arrays.asList(
                "Tst:      (2344.45)",
                "        Tst:      53.00",
                "Tst:     2777,46.00",
                "Tst: 245"
        );
        inputs.forEach(in->{
            Matcher m = p.matcher(in);
            if (m.matches()) {
                System.out.println(m.group(1)+" "+m.group(2)+m.group(3)+m.group(5));
            }
        });
0 голосов
/ 29 апреля 2020

Попробуйте следующий regExp:

[\\d+,?\\d+]*[\\.\\d+]?

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

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

Теперь вы можете получить значение String, используя group(1) и число с десятичной дробью и запятой, используя group(2)

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