Как получить все числа, кроме тех, которым предшествует текстовый патерн - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу получить все числа в формате xx.xx, за исключением тех, которым предшествует текст «емкость». Например, учитывая текст A car has 34.5 gallons, milleage capacity of 60.7 and a cost of 2000.00., я хочу получить 34,5 и 2000,00, но не 34,5, потому что ему предшествует «емкость».

Я пытался (?<!capacity of )\d+\.\d+, но это не работает, это продолжает возвращаться 0.7.

Есть подсказки? Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Просто выведите пространство из парентеза

(?<!capacity of) \d+\.\d+
1 голос
/ 01 апреля 2020

Только для разновидностей PCRE!

Если выбранный вами язык использует движки PCRE (например, такие языки, как Perl, PHP или R), то вы можете использовать управляющие глаголы обратного хода чтобы заставить двигатель забыть что-то соответствовало. Нужное выражение:

capacity of \d+\.\d+(*SKIP)(*FAIL)|\d+\.\d+

См. На Regex101

Это работает следующим образом:

  1. Мы настроили шаблон на first попытайтесь найти то, что нам не нужно - полный шаблон capacity of \d+\.\d+, который разрешается до текста «емкость 60,7».
  2. Затем управляющие глаголы (*SKIP)(*FAIL) заставляют двигатель забыть этот матч и продолжить с этой позиции и далее .
    • (*SKIP) инструктирует его никогда не возвращаться за пределы этой точки
    • (*FAIL) делает паттерн всегда неудачным в этой точке
  3. Наконец, так как мы do хотите сопоставить \d+\.\d+, который настроен как шаблон изменения через |.

Порядок изменений важен - если вы пытаетесь сопоставить \d+\.\d+, тогда механизм регулярных выражений никогда не будет проверять следующее изменение, так как первое было удовлетворено. Следовательно, вы хотите, чтобы шаблон, который нужно удалить, был первым.

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

Если вы хотите отменить больше элементы, то вам нужно настроить их как изменения таким же образом, например, вы не хотите совпадать с ди git с последующими a, b или c, но с чем-либо еще, так что Вы можете сделать

\da(*SKIP)(*FAIL)|\db(*SKIP)(*FAIL)|\dc(*SKIP)(*FAIL)|\d

См. на Regex101

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