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

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

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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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+ пробелов и конец строки.

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

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