Я пытаюсь извлечь значение £ в конце каждой из этих строк:
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 я подумал, что следующим шагом будет просто добавить £.*
в конец, но это все равно возвращает то же самое. Может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь? Спасибо
На самом деле я использую стороннее программное обеспечение, которое читает PDF-файлы. Я использую в нем опцию для подачи регулярного выражения для уточнения извлеченной строки. Их руководство пользователя указывает на веб-сайт Microsoft, но ничего не объясняет. Я бы предположил, что программное обеспечение написано на С#, но я не могу этого гарантировать.
цену можно зафиксировать в группе типа ^(?!Subtotal.*).*(£.+)$
Если библиотека регулярных выражений .NET, вы можете использовать (?<!^Subtotal.*)£[0-9.]+$
Спасибо вам обоим за ваши ответы. К сожалению, программа ничего не возвращает ни для одного из них. В ответе @Erwan, если я предваряю его (?m), то он снова возвращает целые строки. Я думаю, что, возможно, электронное письмо авторам программы может быть полезно, чтобы точно определить, является ли это .net или нет, хотя их ссылка действительно указывает на страницу справки Microsoft .net.
Играя с этим, используя (?m)((£.+)$)
, я получаю все £. Итак, первая часть делает то, что должна, вторая часть тоже делает то, что должна, но вместе возвращают все. Очень странно.
Поиграв с этим дальше, у меня есть кое-что, что работает. В конце концов, это была комбинация ответов @Erwan и @Wiktor Stribiżew:
Программное обеспечение требует, чтобы я использовал многострочную инструкцию (?m)
. И используя комбинацию двух из приведенных выше комментариев, работает следующее:
(?m)((?<!^Subtotal.*)(£.+)$)
Вы можете использовать
(?m)(?<!^Subtotal.*)£[0-9.]+(?=\s*$)
Подробности
(?m)
- многострочный флаг, который заставляет ^
совпадать с началом строки, а $
совпадать с концом строки.(?<!^Subtotal.*)
- отрицательный просмотр назад, который соответствует местоположению, которому не предшествует непосредственно Subtotal
, и любым символам 0+ после него в начале строки.£
- символ £
[0-9.]+
- 1 или более цифр или точек(?=\s*$)
— положительный просмотр вперед, который соответствует позиции, за которой сразу следует 0+ пробелов и конец строки.
Какой инструмент/язык программирования вы используете?