введите число с запятой или точкой с регулярным выражением - PullRequest
1 голос
/ 15 октября 2019

У меня есть код регулярного выражения

https://regex101.com/r/o5gdDt/8

Как вы видите этот код

(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d,])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)

может захватывать все цифры, которые разделены на 3 цифры в тексте, как

  • "здесь 100,100"
  • "23,456"
  • "1,435"

все более 4 цифр, как без запятой

  • 2345

  • 1234 "здесь 123456"

и этот тип номера

  • 65,656½
  • 65,656½,
  • 23,123½

Единственная крошечная проблема заключается в том, что после запятой (точка)Первые два типа он не может захватить тех. например, он не может захватить

  • "здесь 100,100",
  • "23,456,"
  • "1,435,"

к сожалению, есть несколько чисел intext, которые заканчиваются запятыми ... может кто-нибудь подскажет, как изменить это, чтобы захватить выше?

Я пытался сделать это, и измененная версия такова:

(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)

в основном я удаляю запятую в (?! [\ D,]), но это вызывает другую проблему в моем контексте, она захватывает часть числа, которая является частью уравнения, например:

4 310 747 475х2 57 349 565 416 398х.

см. Здесь:

https://regex101.com/r/o5gdDt/10

Я знаю, что это особенный вопрос, я был бы рад узнать ваши иды

1 Ответ

2 голосов
/ 15 октября 2019

Основная проблема здесь в том, что (?![\d,]) терпит неудачу при любом совпадении, за которым следует цифра или запятая, в то время как вы хотите потерпеть неудачу при совпадении, когда за ним следует цифра или запятая плюс цифра.

Замените (?![\d,]) на (?!,?\d).

Кроме того, (?<!\S)(?<![\d,]) выглядит избыточно, поскольку (?<!\S) требует пробел или начало строки, и это, безусловно, не цифра или ,. Либо используйте (?<!\S) или (?<!\d)(?<!\d,) в зависимости от ваших требований.

Присоединяйтесь к отрицательным взглядам с помощью ИЛИ: (?!x)(?!/) => (?!x|/) => (?![x/]).

Вы хотитеизбегайте совпадения лет, но вы просто пропускаете все числа, начинающиеся с них, поэтому 2020222 не будет совпадать. Добавьте (?!\d) к прогнозу, (?!(?:1[2-9]\d\d|20[01]\d|2020)(?!\d)).

Таким образом, шаблон может выглядеть следующим образом:

(?<!\S)(?:(?!(?:1[2-9]\d\d|20[01]\d|2020)(?!\d))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?!,?\d)[\u00BC-\u00BE\u2150-\u215E]?(?![x/])

См. regex demo .

ВАЖНО : у вас есть [\u00BC-\u00BE\u2150-\u215E]?(?![x/]) в конце, негативный взгляд после необязательного паттерна. Как только двигатель не может найти соответствие для x или /, он будет возвращен и, скорее всего, найдет частичное совпадение. Если вы не хотите сопоставлять 65,656 в 65,656½x, замените [\u00BC-\u00BE\u2150-\u215E]?(?![x/]) на (?![\u00BC-\u00BE\u2150-\u215E]?[x/])[\u00BC-\u00BE\u2150-\u215E]?.

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

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