Ниже приведен шаблон, соответствующий числам. Работает почти. Вторая строка должна совпадать с 99, но совпадения нет? Почему?

(?<!\d[- ]|[\d.,])\(?-?(?:(?:[1-9]\d{0,2}(?:(?:[. ]\d{3})*|\d*))|0)(?:\b|[,]\d{1,3})-?\)?(?![\d.,\/]|-[\d\/])


100,00stk => 100,00
99stk => 99 \\ this is not matched
10,45stk => 10,45

https://regex101.com/r/nwRCKo/1

0
clarkk 26 Ноя 2021 в 17:38
Это связано с границей слов в (?:\b|,\d{1,3}), см. regex101.com/r/nwRCKo/2, если вы удалите его, вы получите совпадение. Однако шаблон слишком расплывчатый и, вероятно, не будет работать даже после этого исправления.
 – 
Wiktor Stribiżew
26 Ноя 2021 в 17:40
После удаления `\ b | ´ он по-прежнему не работает
 – 
clarkk
26 Ноя 2021 в 17:41
Это действительно так - regex101.com/r/nwRCKo/2
 – 
Wiktor Stribiżew
26 Ноя 2021 в 17:42
Создайте ответ :)
 – 
clarkk
26 Ноя 2021 в 17:45
Хорошо, но я полагаю, что (?![\d.,\/]|-[\d\/]) не работает для вас так, как вам нужно. По крайней мере, после удаления \b он во многих случаях перестанет работать. Шаблон должен быть исправлен, но требований к нему у меня нет.
 – 
Wiktor Stribiżew
26 Ноя 2021 в 17:47

1 ответ

Лучший ответ

Основная проблема здесь заключается в использовании границы слов, но решение проблемы не так очевидно.

Главное в регулярном выражении, которое у вас есть, заключается в том, что оно соответствует некоторым числам в каком-то конкретном контексте, а поисковые запросы с обеих сторон предназначены для того, чтобы не соответствовать совпадению, так что вы вообще не получите совпадение. Если вы поместите отрицательный просмотр вперед после необязательного символа ), механизм регулярных выражений может выполнить возврат, и вы все равно получите это совпадение. Здесь вам нужно предотвратить любой возврат после удаления границы слова.

Итак, замените (?:\b|[,]\d{1,3}) на (?:[,]\d{1,3})? и сделайте все последующие необязательные шаблоны атомарными, применив притяжательные кванторы:

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

См. эту демонстрацию регулярного выражения.

0
Wiktor Stribiżew 26 Ноя 2021 в 18:11