2010-09-11 5 views
1

У меня есть две строки, из которых мне нужно вытащить данные, но, похоже, не может заставить их работать. Хотел бы я знать регулярное выражение, но, к сожалению, я этого не делаю. Я прочитал несколько учебников для начинающих, но я не могу найти выражение, которое будет делать то, что мне нужно.Как я могу использовать регулярное выражение для решения этой проблемы?

Из этой первой строки, разделенной символом равенства, мне нужно пропустить первые 6 символов и захватить следующие 9 символов. После равного характера мне нужно захватить первые 4 символа, которые являются днем ​​и годом. Наконец, для этой строки мне нужны оставшиеся числа, которые являются датой в YYYYmmdd.

636014034657089=130719889904 

Вторая строка кажется немного сложнее, потому что промежутки между символами различаются, но всегда, кажется, ограничен, как минимум, одним пробелом. Иногда существует целых 15 или 20 пробелов, разделяющих блоки данных.

Вот два разных образца, которые показывают разницу в пространстве.

!!92519 C 01 M600200BLNBRN D55420090205M1O 

!!95815  A    M511195BRNBRN   D62520070906 ":%/]Q2#0*& 

Данные, которые мне нужно из этих двух последних строк являются:

The zip code following the 2 exclamation marks. 
The single letter 'M' following that. It always appears to be in a 13 character block 
The 3 numbers after the single letter 
The next 3 numbers which are the person's height 
The following next 3 are the person's weight 
The next 3 are eye color 
The next block of 3 which are the person's hair color 

Последний блок, что мне нужно данные:

Мне нужно, чтобы получить одну букву, которая в Пример выглядит как «D». Пропустить следующие 3 цифры Последний и оставшиеся 8 цифр, которые являются датой в YYYYmmdd

Если кто-то может помочь мне разрешить это, я был бы очень признателен.

+1

Какой язык программирования вы используете? Не все языки имеют одинаковый синтаксис для регулярных выражений. – newbie

+1

вопрос помечен PHP – nico

ответ

2

Для первой строки вы можете использовать это регулярное выражение:

^[0-9]{6}([0-9]{9})=([0-9]{4})([0-9]{4})([0-9]{2})([0-9]{2})$ 

Объяснение:

 
^   Start of string/line 
[0-9]{6} Match the first 6 digits 
([0-9]{9}) Capture the next 9 digits 
=   Match an equals sign 
([0-9]{4}) Capture the "day and year" (what format is this in?) 
([0-9]{4}) Capture the year 
([0-9]{2}) Capture the month 
([0-9]{2}) Capture the date 
$   End of string/line 

Для второго:

^!!([0-9]{5}) +.*? +M([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2}) 

Rubular

Это работа s аналогично первому. Возможно, вам придется немного настроить его, если ваши данные не соответствуют формату, ожидаемому регулярным выражением. Возможно, вы захотите заменить .*? на что-то более точное, но я не уверен, потому что вы не описали формат тех частей, которые вам не интересны.

+0

Thanks Mark. Я собираюсь попробовать это сейчас. – Jim

+1

@Jim - используйте группу захвата. – TrueWill

+0

Mark, Второе регулярное выражение ничего не соответствует. Я получаю ошибку компиляции. «Ошибка компиляции: ничего не повторять при смещении 45» – Jim