2014-10-31 4 views
0

У меня есть строка, которая выглядит следующим образом:Снять кронштейн из строки с помощью регулярных выражений в Perl

(ABCD)(ABCDE)(ABCDEF)(ABCDEFG) 

, но я хочу, чтобы сохранить его как это:

ABCDABCDEABCDEFABCDEFG 

в переменной под названием парсер. Код я использую

my ($parser) = $subckt =~ m/\s*(\(.*?)\); 

Здесь $subckt переменная хранит фактические строки в квадратных скобках.

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

ответ

1

Если вы просто хотите, чтобы удалить скобки, как следует из названия, оператор подстановки s/// является естественным выбором:

my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)'; 
my $parser = $subckt; 
$parser =~ s/[()]//g; 

Тем не менее, это немного трудно догадаться, что вы действительно хотите делать и какие возможные входы у вас есть. Основываясь на сломанном регулярном выражении в сообщении, возможно, вы действительно хотите изменить модели \s*\(X\) на X. Если это так, то вместо подстановки, будет проще использовать сопоставление с захвата группы, подобно тому, как вы, кажется, пытались:

my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)'; 
my ($parser) = join('', $subckt =~ m/\s*\((.*?)\)/g); 

Это также будет работать с входным сигналом как это:

my $subckt = '  (ABCD) (ABCDE)(ABCDEF)(ABCDEFG)'; 

как это работает:

  • m/...(...).../g возвращает список совпавших строк захваченный в (...)
  • То, что вы хотите, чтобы соответствовать этому веществу в буквальном ( и ), так что выражение на самом деле должно выглядеть m/...\((...)\).../g, обратите внимание на \( и \) за пределы (...) захвата
  • Флаг /g является важным (не хватал в ваших), в противном случае сопоставление с образцом остановится после первого матча
+0

Одна из причин downvote будет: Это не работает, если строка не содержит круглые скобки. Это не работает, если скобки не сбалансированы. Он имеет случайное совпадение пробелов '\ s *', которое ничего не делает. Тот факт, что он работает вообще, заключается в том, что вы используете только определенный набор входных данных. Гораздо лучшей версией того же самого было бы использовать регулярное выражение '/ [^()] +/g'. Но даже тогда он уступает простому удалению '()' с 'tr', как предлагает Бородин. – TLP

+0

Кроме того, это может привести к неправильному результату, например, 'ABC (D' вернет' ABC', а не 'ABCD'. – TLP

+0

@TLP OP имел' \ s * \ ('в своем шаблоне, предлагая ему чтобы избавиться от не только parens, но и любых пробелов прямо перед открытием. Что правильно и что не так делать с ABC (D' - это спекуляция, потому что OP не предоставлял никакой информации о таких входах. если вы просто хотите удалить '()', то 'tr ///' не является правильным инструментом, это должно быть 's ///'. В любом случае, я переписал свой пост, чтобы уточнить – janos

0

Try замена всех occuences кронштейна, к которой флаг г делает

$subckt =~ s/\(//g; 
$subckt =~ s/\)//g; 
1

инициализировать новую переменную, а затем удалить все несловообразующим символы

(my $parser = $subckt) =~ s/\W//g; 

Или с помощью /r Modifier:

my $parser = $subckt =~ s/\W//gr; 
+0

Это, вероятно, предрешено, но может ли downvoter прокомментировать? – Borodin

+0

Требование состояло в том, чтобы удалить скобки, а не все символы, отличные от слов. Это решение может быть в порядке для данных образца , но может удалить другие символы, которые пользователь хочет сохранить. –

+0

@ KimRyan Учитывая, что OP борется в основном с тем, как использовать оператор сопоставления, представляется разумным сделать это в основном о том, как создать модифицированную версию исходной переменной с помощью оператора подстановки. Тем не менее, я согласен с тем, что, если их реальные данные сильно отличаются от их выборочных данных, решение потребует тонкой настройки. – Miller

2

перевести оператор tr является то, что вам нужно. С помощью модификатора /d (delete) вы можете удалить все символы из списка, которые не имеют соответствующей замены.

Если у вас есть версия 14 или более поздняя версия Perl 5, модификатор /r (неразрушающий) делает его намного более аккуратным.

Эта программа демонстрирует

use 5.014; 

my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)'; 
my $parser = $subckt =~ tr/()//dr; 

print $parser; 

выход

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