2012-04-08 3 views
0

Я открываю файл и найти строку, мне нужно, но у меня есть проблемы, создавая переменную из найденной строкикак извлечь значение из строки найдено

70c 08:04:04.014 rexx TRACE 2203 8=4.4|9=892|35=J|49=ICE_SM_S|56=SM|34=280|70=0241608914160889|71=0|626=2|793=16|72=|466=1164266784|857=0|73=1|11=|37=1156426784|526=1156426674|38=1|198=1310883PTM|54=1|6=117.2100000000|336=R|625=P|55=B|461=FXXXXX|200=20120901|207=IFEU|53=1|30=ICE|453=2|448=SLM|447=C|452=7|448=FFC|447=C|452=12|75=20120210|60=20120310-09:04:04|77=O|58=CYU795|232=14|233=GL_TRADEJOBOUT|234=N|233=GL_ORDERJOBOUT|234=N|233=GL_TAKEN|234=0|233=GL_TRADETYPE|234=E| 

Это строка, и я хочу присвоить его переменной tag198, так что было бы

tag198 = '1310883PTMS' 

Все, что после того, как | не требуется.

tag198 = line.match(/198=(.*)/)[1] 
puts tag198 

, но который сохраняет все после 198; Мне нужна строка только до |.

ответ

1

Ваше постоянное выражение * является жадным и будет потреблять все символы, которые он может, не останавливая остальную часть выражения от соответствия. В выражении, в котором говорится о рубине, нет ничего, чтобы прекратить собирать символы.

Посмотрите на regular-expressions.info. Частичным решением вашей проблемы было бы поставить '|' после захвата:

tag198=line.match(/198=(.*)\|/)[1] puts tag198

'|' в противном случае имеет особое значение в регулярных выражениях. Это пока не работает, потому что * все еще может потреблять '|' символов, если он остается одним из них, чтобы соответствовать символу '|' в нашем выражении. Чтобы устранить полностью, предотвратить * от захвата любых труб:

tag198 = line.match(/198=([^|]*)\|/)[1] puts tag198

Посмотреть результаты этого изменения here.

+0

Я пробовал ваше регулярное выражение '/ 198 = (. *) \ | /', И оно не соответствовало корректности (такая же проблема, как и для OP). Решение @ ctcherry действительно работает. – Alex

+0

Согласен - только что обновил ответ с поправкой – sgmorrison

+0

'line.match (/ 198 = (. *) \ | /) [---] --- --- все еще оставляет след –

3

Измените регулярное выражение:

/198=(.+?)\|/ 

Это делает его не жадный и останавливаться на вертикальной панели. Вы должны избегать вертикальной полосы, потому что это обычно означает «OR» в регулярном выражении.

0

Если только буквы и цифры можно использовать

/198=([A-Za-z0-9]*)/ 

Кроме того, в случае, если вы не знаете, вы можете проверить регулярные выражения на rubular.com, он также предоставляет информацию о специальных хартий в регулярные выражения, это отличный сайт для всех ваших регулярных выражений, даже если он не для рубинов.

Смежные вопросы