Регулярное выражение для значения в каждой строке, которая не начинается со строки

Я пытаюсь извлечь значение £ в конце каждой из этих строк:

Subtotal test test £20.00
Value £10.00
Subtotal test 2 £4.00
Value2 £30.00

За исключением того, что я не хочу включать строки, начинающиеся с «Итог».

Итак, чтобы было ясно, в этом примере я просто хочу вернуться:

£10.00
£30.00

До сих пор у меня был ограниченный успех, с несколькими примерами SO, включая Как сопоставить строку, не содержащую слова. Экспериментируя с этим (https://regex101.com/r/NcXg2m/1), я начал с:

(?m)^(?!Subtotal.*).*

Что дает мне целые строки для всего, что не начинается с «Промежуточный итог».

После просмотра https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference я подумал, что следующим шагом будет просто добавить £.* в конец, но это все равно возвращает то же самое. Может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь? Спасибо

Какой инструмент/язык программирования вы используете?

Wiktor Stribiżew 22.05.2019 14:47

На самом деле я использую стороннее программное обеспечение, которое читает PDF-файлы. Я использую в нем опцию для подачи регулярного выражения для уточнения извлеченной строки. Их руководство пользователя указывает на веб-сайт Microsoft, но ничего не объясняет. Я бы предположил, что программное обеспечение написано на С#, но я не могу этого гарантировать.

Joe J 22.05.2019 14:49

цену можно зафиксировать в группе типа ^(?!Subtotal.*).*(£.+)$

Erwan 22.05.2019 14:50

Если библиотека регулярных выражений .NET, вы можете использовать (?<!^Subtotal.*)£[0-9.]+$

Wiktor Stribiżew 22.05.2019 14:52

Спасибо вам обоим за ваши ответы. К сожалению, программа ничего не возвращает ни для одного из них. В ответе @Erwan, если я предваряю его (?m), то он снова возвращает целые строки. Я думаю, что, возможно, электронное письмо авторам программы может быть полезно, чтобы точно определить, является ли это .net или нет, хотя их ссылка действительно указывает на страницу справки Microsoft .net.

Joe J 22.05.2019 15:02

Играя с этим, используя (?m)((£.+)$), я получаю все £. Итак, первая часть делает то, что должна, вторая часть тоже делает то, что должна, но вместе возвращают все. Очень странно.

Joe J 22.05.2019 15:18
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
6
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поиграв с этим дальше, у меня есть кое-что, что работает. В конце концов, это была комбинация ответов @Erwan и @Wiktor Stribiżew:

Программное обеспечение требует, чтобы я использовал многострочную инструкцию (?m). И используя комбинацию двух из приведенных выше комментариев, работает следующее:

(?m)((?<!^Subtotal.*)(£.+)$)

Вы можете использовать

(?m)(?<!^Subtotal.*)£[0-9.]+(?=\s*$)

Подробности

  • (?m) - многострочный флаг, который заставляет ^ совпадать с началом строки, а $ совпадать с концом строки.
  • (?<!^Subtotal.*) - отрицательный просмотр назад, который соответствует местоположению, которому не предшествует непосредственно Subtotal, и любым символам 0+ после него в начале строки.
  • £ - символ £
  • [0-9.]+ - 1 или более цифр или точек
  • (?=\s*$) — положительный просмотр вперед, который соответствует позиции, за которой сразу следует 0+ пробелов и конец строки.

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

Другие вопросы по теме