Витяг номера з регулярним виразом


0

Я маю цей рядок:

> HTTP/1.1 200 OK Date: Tue, 12 Nov 2013 15:26:17 GMT Server:
> Apache/2.2.3 (CentOS) Last-Modified: Fri, 08 Nov 2013 21:34:50 GMT
> ETag: "452//path/to/file"
> Accept-Ranges: bytes Content-Length: 26010 Connection: close
> Content-Type: text/plain; charset=UTF-8

І хотілося б витягти 452, що є раніше // і після ETag, який регулярний вираз слід використовувати?

Відповіді:


3

Давайте розбиваємо ваш запит на різні частини синтаксису:

екстракт 452

Ви не вказали, чи це число завжди буде 452, або якщо це буде інше число, але я вважаю, що це може бути інше число, оскільки в іншому випадку вам не потрібен регулярний вираз. По-перше, ви шукаєте цифру і синтаксис для цього \d. Якщо ви шукаєте тризначний номер, ви можете це зробити \d\d\d які можуть бути більш чітко написані як \d{3}. Якщо потрібно будь-яке ціле число, незалежно від кількості цифр, ви повинні використовувати + оператора, що означає одне або більше. Отже, давайте припустимо, що ви хочете зловити найбільш загальний випадок, у якому випадку ви будете використовувати \d+.

яка раніше //

Для цього буде потрібно те, що називається позитивним. Ви можете перевірити Докладніше про lookaheads , але суть полягає в тому, що вона буде знаходити лише збіги, за якими йде текст, вказаний на початку, але не включати текст перегляду на початку матчу. Синтаксис перегляду є (?=@@@) де @@@ - це регулярний вираз, який відразу ж піде за матчем. Наприклад, пошук // буде виражено (?=//).

і після ETag

Для цього ми будемо використовувати протилежне позитивному погляду голову: позитивний погляд ззовні. Синтаксис для цього є (?<=@@@) де @@@ це регулярний вираз, який безпосередньо передує матчу. Наприклад, пошук ETag: " міг би бути (?<=ETag: ")

Поклавши все це разом, ви б використали позитивний погляд, зіставлення, яке ви шукаєте, і позитивний погляд. Таким чином, ви шукаєте регулярний вираз:

(?<=ETag: ")\d+(?=//)

Це дозволить отримати ціле число будь-якої кількості цифр між текстом Etag: " і //.

Я припускаю, що у вас вже є середовище, де можна запустити регулярний вираз. Якщо ні, то інші питання на Exchange Stack допоможуть вам знайти їх.


0

Існує кілька способів зробити це, залежно від того, який інструмент ви віддаєте перевагу. Використання awk:

$ awk '/ETag: "[0-9]+\/\// { printf "%s\n", gensub(".*ETag: \"([0-9]+)//.*", "\\1", $0); }' < mylog
452

(припускаючи, що файл mylog містить ваш текст).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.