2014-11-21 2 views
1

나는 $text 문자열이 있고 그것을 정규식으로 수정하고 싶습니다. 문자열에 <NAME>John</NAME>과 같은 여러 섹션이 있습니다.펄 정규식에서 물건을 대체하는 방법

은 내가 일반적으로

$text =~ m/<NAME>(.*?)<\/NAME>/g 

같은 것을 함께 할하지만있는 나는 것, 선두에없고 후행 공백 아무 선도하는 단어가 아닌 문자가 없는지 확인 가도록 섹션을 검색하려면 일반적으로 다음과 같이 지정하십시오.

$temp =~ s/^\s+|\s+$//g; # trim leading and trailing whitespaces 
$temp = s/^\W*//g; # remove all leading non-word chars 

이제 제 질문은 : 실제로 이것을 어떻게합니까? m// 대신 s/// 정규식을 사용할 수 있습니까?

+3

XML 데이터가 포함 된 변수는 [XML :: Twig'] (https://metacpan.org/module/)과 같은 적절한 XML 구문 분석기를 사용하여 처리해야합니다. XML :: Twig) 또는 ['XML :: LibXML'] (https://metacpan.org/module/XML::LibXML). 정규식은 작동하지 않습니다. 그럴 수 있다고 생각할 수도 있지만, 언젠가는 데이터가 바뀌고주의를 기울이지 않으면 프로그램이 실패하게됩니다. – Borodin

+0

대체 할 항목을 언급하는 것을 잊었습니다. ''안에있는 단어 는요? – Cameron

+0

내가 대체하고 싶은 것은 사이에 무엇이든간에 대체하고 싶습니다. 그리고 이것은 전체 문자열에 나타나는 유일한 종류의 태그이므로 큰 XML 시스템을 사용하고 싶지 않습니다. – user1769925

답변

0

는 태그 (이 정규 표현식을 사용하여 XML을 "구문 분석"하는 것이 가능하는 한) 내부 단지 "정리"텍스트입니다.

1

단일 대체로 가능하지만 불필요하게 복잡합니다. 대체 대체품을 사용하여 2 단계 대체를 제안합니다.

my $text = '<NAME> %^John^% 

</NAME>'; 

$text =~ s{ (?<=<NAME>) ([^<>]*) (?=</NAME>) }{ 
    (my $new = $1) =~ s/\A\s+|\s+\z//g; 
    $new =~ s/\A\W+//; 
    $new; 
}eg; 

print $text; 

출력은

<NAME>John^%</NAME> 

이것은 당신이 버전 14 이상 펄 5의를 가지고 있고, 비파괴 (/r 수정) 대체 모드를 사용하려는 경우에도 간단하다. 당신이 원하는 무엇을 만약 내가 제대로 이해하고

$text =~ s{ (?<=<NAME>) ([^<>]*) (?=</NAME>) }{ $1 =~ s/\A\s+|\s+\z//gr =~ s/\A\W+//r }exg; 
+0

안녕 Borodin,이 멋지 네요,하지만 딸기 펄 5.20.1. 아무것도 대체하지 않고 원래의 문자열을 출력 ... 또한, 당신은 내게 계몽 수 있습니까? = 처음과 마지막 그룹화에서 정규식합니까? 감사! – user1769925

+1

@ user1769925 : regexes로 XML을 처리하는 것에 대한 경고 메시지를 읽었습니까? 그것들은 [* look-around assertions *] (http://perldoc.perl.org/perlre.html#Extended-Patterns)입니다. 패턴은 꺽쇠 괄호'<>'이외의 문자의 순서에 매치되며 즉시 * * 앞에 ''이 붙고 즉시 * 뒤에 ''이옵니다. 첫 번째 코드 블록을 독자적으로 실행 해 보았습니까? 내가 한 것과 같은 결과를 얻었습니까? 대체품 중 어떤 변형이 효과가 없습니까? – Borodin

+0

그 정보를 주셔서 감사합니다, 지금 나는 앞/뒤 모습을 이해합니다. 그러나 코드는 실제로 내 컴퓨터에서 어떤 것도 대체하지 않는 것처럼 보입니다. $ text를 그대로 출력합니다. 아래의 솔루션은 그룹을 사용하여 해결합니다. – user1769925