2013-08-26 3 views
2

Я имею строку какMatch строку с регулярным выражением

-------- AGG x y PORT-16385-INFO ----------------------------+ 

Я хочу, чтобы извлечь "AGG х у PORT-16385-INFO". Однако этот шаблон не такой. Он может иметь любое количество пробелов между ними.

Помогите мне с регулярным выражением, чтобы получить строку.

Я использую регулярное выражение

regexp {\s+(.*)\-\-*} $a - am 

Ouput

AGG PORT-16385-INFO --------------------------- 

это не я хочу. Помогите мне с регулярным выражением.

+0

Ваше регулярное выражение грубо захватывает «по крайней мере одну пробел, какую-нибудь какую-нибудь черту». Думаю, это не то, что вы хотите. Подтвердите, что ваша целевая строка соответствует «AGG x y PORT-16385-INFO» или? Где, конечно, могут возникнуть пробелы в этом? – mvw

+0

Если это действительно perl, вы можете сделать гораздо более безопасную вещь и обрезать начало и конец с помощью 's ///', например. 's/^ - + //; s/- + \ + $ //; '. – TLP

ответ

4

Ну, я предполагаю, что ваш разделитель имеет длину не менее двух - и разделен через пробел из содержимого. Тогда тривиальное регулярное выражение, подобное

--\s+(.*?)\s+-- 

уже работает. Коэффициент *? делает неживое соответствие, чтобы как можно раньше завершить работу.

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

Я также удивлен, что вы отметили это как Perl - я уверен, что ваш код недействителен Perl-код.


Если вы не хотите использовать класс . символов, то мы можем переписать его, чтобы соответствовать все символы без дефиса или один дефис, за которым следует не-дефис:

--\s+((?:[^-]+|-[^-])*)\s+-- 

Regular expression visualization

Возможно, вы захотите также запретить новые строки вдоль дефисов.

+0

Извините. Это код tcl, но мне нужно это регулярное выражение для использования в perl. regexp - то же самое. Кстати, мы можем использовать без. *? квантор – Nitesh

+0

@Nitesh, использующий '. *' вместо '. *?' *, может работать здесь, потому что мне нужен пробельный символ перед дефисом.Однако использование не жадной версии, как правило, безопаснее. – amon

+0

Спасибо. Но посмотрите, не можете ли вы дать regexp без. *? – Nitesh

3

Использование .*? может работать, как говорит амон, однако иногда я обнаружил, что не-жадный квантор несколько непредсказуем. Вы можете использовать якоря, чтобы сделать жадный квантор сделать то же самое:

^-+ (.*) -+\+$ 

Здесь мы требуем строки, чтобы начать и закончить с указанной последовательностью штрихов (и знаком плюс в конце), так жадный матч не допускается слишком много.

1

В tcl вы легко справляетесь с этим, используя строчную обрезку.

set a "-------- AGG x y PORT-16385-INFO ----------------------------+" 
set b [string trim $a +-]; # to remove all + and - 
set b [string trim $b]; # to remove all the white spaces 
puts $b 
Смежные вопросы