У меня есть эта строка:

> 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 , какое регулярное выражение я должен использовать?

2 ответа2

3

Давайте разберем ваш запрос на различные части синтаксиса:

экстракт 452

Вы не указали, будет ли число всегда 452 или это будет другое число, но я предполагаю, что это может быть другое число, так как в противном случае вам не понадобится регулярное выражение. Сначала вы ищете цифру и ее синтаксис \d . Если вы ищете 3-значное число, вы можете сделать \d\d\d который можно более четко записать как \d{3} . Если вам нужно любое целое число, независимо от количества цифр, вы должны использовать оператор + , обозначающий одну или несколько. Итак, давайте предположим, что вы хотите поймать наиболее общий случай, в этом случае вы бы использовали \d+ .

что раньше //

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

и после ETag

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

Сложив все это вместе, вы бы использовали позитивный взгляд сзади, совпадение, которое вы ищете, и позитивный взгляд вперед. Итак, регулярное выражение, которое вы ищете:

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

Это извлечет целое число любого количества цифр между текстом Etag: " и // .

Я предполагаю, что у вас уже есть среда, в которой вы можете запустить регулярное выражение. Если нет, то другие вопросы по Stack Exchange помогут вам найти его.

0

Есть несколько способов сделать это, в зависимости от того, какой инструмент вы предпочитаете. Использование awk:

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

(при условии, что файл mylog содержит ваш текст).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .