Regex для монеты Испанский Международный формат

Я отношусь matchear к формату монеты xxx.xxx.xxx,xx, это какие-то примеры форматов, которые были бы действительными:

29.332.893,32
-29.332.893,32 // Podrían ser numero negativos
29.332.893,322313213123132
00
00,1212
394458,92 // Notesé que los puntos son opcionales

У меня есть эта Regex: \b[0-9]+(([\\.][0-9]{3})*([\\,][0-9]+)*)*\b

Проблема, - в котором в следующем списке matchea ты оценил, что он не интересует меня, что matcheen:

10.98,09 // Matchea el 10 por un lado y 98,09 por el otro
10.980456 // Matchea el 10
00.2da02 // Matchea el 00
4,098.09 // Matchea 4,098 por un lado y 09 por el otro
121837182372133.321321313 // No debería matchear ya que los puntos es cada 3 numeros, ahora me matchea 121837182372133 por un lado, y 321321313 por el otro

Я искал, но я не нахожу способ, которого matcheen только действительные форматы, так как я использую Matcher, и когда появляются недействительные форматы всегда, я оставляю себе данные, которые не были бы должны быть рассудительными.

ЗАМЕЧАНИЕ

Суммы могли бы появляться любой формы, например, список действительных форматов, которые я поместил наверху, мог бы оказываться таким (Это только какие-то примеры):

total: $         29.332.893,32 // Con el signo y espacios
tosdaasdtal: -29.332.893,32
tosdaasdtal: 29.332.893,32 // Sin el signo pesos
total: 29.332.893,322313213123132 asasasaasdasd
to333tal: $00
toastal: $00,1212
total: $       00
394458,92 // Solo

С уже большое спасибо.

2
задан 20.01.2017, 00:38
0 ответов

Имеются 2 действительных формата:

  1. Без разделителя тысяч:

    (?:- ?)?\d+(?:,\d+)?
    
  2. С такими точками как разделитель тысяч:

    (?:- ?)?\d{1,3}(?:\.\d{3})*(?:,\d+)?
    

А именно, соединяя оба выражения:

(?:- ?)?(?:\d{4,}|\d{1,3}(?:\.\d{3})*)(?:,\d+)?


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

  1. ни предшествовавший из-за:

    (?<!\d[.,]?)
    
  2. ни последованный из-за:

    (?![.,]?\d)
    


Регулярное выражение

(?:- ?)?(?<!\d[.,]?)(?:\d{4,}|\d{1,3}(?:\.\d{3})*)(?:,\d+)?(?![.,]?\d)

Код:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "(?:- ?)?(?<!\\d[.,]?)(?:\\d{4,}|\\d{1,3}(?:\\.\\d{3})*)(?:,\\d+)?(?![.,]?\\d)";
final Pattern pattern = Pattern.compile(regex);

final String texto = "total: $         29.332.893,32"
                   + "\ntosdaasdtal: -29.332.893,32"
                   + "\n10.98,09"
                   + "\n10.980456"
                   + "\n00.2da02"
                   + "\n4,098.09"
                   + "\n121837182372133.321321313"
                   + "\ntosdaasdtal: 29.332.893,32"
                   + "\ntotal: 29.332.893,322313213123132 asasasaasdasd";
final Matcher matcher = pattern.matcher(texto);

System.out.println("Texto: \n" + texto + "\n");
while (matcher.find()) {
    System.out.println("Número encontrado: " + matcher.group(0));
}

Результат:

Número encontrado: 29.332.893,32
Número encontrado: -29.332.893,32
Número encontrado: 02
Número encontrado: 29.332.893,32
Número encontrado: 29.332.893,322313213123132

Demo:

http://ideone.com/91hay3

2
ответ дан 03.12.2019, 17:37
  • 1
    Снова превосходный Относящийся к Богородице. Funcionó верно, спасибо! –  20.01.2017, 00:55
  • 2
    Для случая 00.2da02 matchea с 02... Я могу добавлять, что не esté предшествуемый буквой. ¿ Qué он тебе кажется, что deberí чтобы делать? –  20.01.2017, 01:02
  • 3
    Así está совершенный, так как цепи почти случайные quizá s я остаюсь без стоимости из-за тот факт, что está n predecedidos из-за буквы. В котором одиноком случае habrí во что менять (?![.,]?\d) на (?![.,]?\d|[^0-9]), нет? –  20.01.2017, 01:05
  • 4
    Чтобы проверять, что не esté предшествуемый буквой, deberí чтобы менять (?<!\d[.,]?) на (?<!\d[.,]?|[A-Za-z])... Роди, что не esté произошедшее, менять (?![.,]?\\d) на (?![.,]?\\d|[A-Za-z]). –  20.01.2017, 01:14