2009-06-19 3 views

답변

1

당신은 뭔가 아무것도하지만, 하나 개 이상의 문자를 일치 반환 할 및 두 번째는 같은 일을하지만, $로 대체 할 바꾸다.

11

[^:] 

perldoc perlreref':' 이외의 모든 문자와 일치하는 문자 클래스를 참조하십시오.

[^:]+ 

은 이러한 문자 중 하나 이상과 일치한다는 의미입니다.

캡처 괄호가 필요한지 잘 모르겠습니다. 어떤 경우이든,

([^:]+): 

은 콜론 (:)으로 끝나는 하나 이상의 콜론이 아닌 문자 시퀀스를 캡처합니다.

+7

나는 첫 번째 것이 닭이라고 생각했습니다. 두 번째는 나쁜 머리카락을 가진 닭이고, 세 번째는 나쁜 머리카락을 가진 닭을 찌르는 사람입니다. 사람을 찌르는 사람들은 특히 닭을 먹었을 때 데이터 세트를 엉망으로 만드는 경향이 있습니다. 따라서이를 발견하고 덜 파괴적인 것으로 교체하는 것이 좋습니다! – daotoad

+1

나는 마지막 하나가 나쁜 머리카락을 가진 닭을 먹는 사람과 더 비슷하다고 말하고 싶습니다. (insertfoodhere) : – user105033

3

첫 번째 문자는 "abc : foo"문자열에서 "abc"와 같이 줄에서 콜론 앞에있는 부분을 캡처합니다. 좀 더 정확히 말하자면 콜론 바로 앞에 적어도 하나 이상의 비 콜론 문자 (가능하면 많은 수)를 매치하여 캡처 그룹에 넣습니다.

을 포함하여 $replace의 내용으로 콜론을 사용했지만 두 번째 부분이 해당 부분을 대신합니다. 전 :/

$ 라인 = "http://www.google.com"이 (변수 $ 1 HTTP를 포함합니다)

$line =~ s/([^:]+):/$replace/; 

이 시간 HTTP 일치하는 경우

+1

콜론이 일치 항목에 포함되므로 대체됩니다. –

+0

아, 죄송합니다. 내 잘못이야. 캡쳐 그룹에 집중했다. – Joey

0
$line =~ /([^:]+):/; 

는 포함되어 있지 않습니다 아무것도 일치 , 변수 $의 내용과 일치하는 값을 바꿉니다.

3

이전 답변에 대한 오해가있을 수 있지만, 초에 대한 혼란이 있다고 생각합니다. 예. 이 아닌 경우은 캡쳐 된 항목 (즉, 콜론까지 하나 이상의 비 콜론)을 $ 대체하여 바꿉니다. ([^:]+):을 모두 $replace (콜론)으로 바꿉니다.

my $line = 'http://www.example.com/'; 
my $replace = 'ftp'; 
$line =~ s/([^:]+):/$replace/; 
print "Here's \$line now: $line\n"; 

출력 : 당신이 비트를 얻을 것이다 당신이 $replace에서 콜론을 포함하지 않는 경우이 의미

(. 치환은 경기뿐만 아니라 캡처에서 작동) (당신이 하나를 원하는) :

Here's $line now: ftp//www.example.com/ # Damn, no colon! 

그냥 예제 코드에서 찾고 있는지 확실하지 않습니다,하지만 당신은 내가 당신이 정말로 이러한 예에서 원하는 모르겠어요 캡처를 사용할 계획이 아니라면.

정규 표현식 (또는 Perl)에 익숙하지 않은 경우 perldoc perlre 또는 perldoc perlretut을 시도하기 전에 perldoc perlrequick을 봐야합니다.

4
$line =~ /([^:]+):/; 

= ~ 연산자가 binding operator이라고 그것은 (이 경우 $ 라인) 스칼라 값에 대해 regex 또는 substitution 실행. 정규식 자체에 관해서는 () 캡처를 지정하십시오. 캡처는 특수 전역 변수에 일치하는 텍스트를 배치합니다. 이러한 변수는 (만약 하나부터 번호가 괄호로 표시 순서에 대응하므로

"abc" =~ /(.)(.)(.)/; 

주어진 $1 변수 "a" 포함될 상기 $2 변수 "b"를 포함하고 $3 변수 "c" 포함될되고 당신은 아직 추측하지 않았습니다 .는 한 문자 *과 일치합니다. []은 문자 클래스를 지정합니다. 문자 클래스는 문자 중 하나와 일치하므로 "a", "b" 또는 "c" 인 경우 /[abc]/은 한 문자와 일치합니다. 문자 클래스는 ^으로 시작하면 무효화 될 수 있습니다. 제외 된 문자 클래스는 목록에없는 문자와 일치하므로 [^abc]"a", "b" 또는 "c"이 아닌 문자 하나와 일치합니다 (예 : "d"이 일치합니다). +을 한정 기호라고합니다. Quantifier는 이전 패턴이 매치해야하는 횟수를 알려줍니다. +은 패턴이 한 번 이상 일치해야합니다. (* 한정 기호는 패턴이 0 번 이상 일치해야 함). :에는 정규식 엔진에 특별한 의미가 없으므로 문자 그대로 :을 의미합니다.

그래서이 정보를 합치면 정규 표현식이 하나 이상의 콜론이 아닌 문자 (이 부분을 $1에 저장)와 콜론이 일치 함을 알 수 있습니다.

$line =~ s/([^:]+):/$replace/; 

이것은 대체 코드입니다. 대체는 정규 표현식과 대체 문자열의 두 부분으로 구성됩니다. 정규 표현식 부분은 정규 표현식과 동일한 규칙을 모두 따릅니다. 교체 부분은 큰 따옴표로 묶인 문자열처럼 취급됩니다. 치환 그래서 다음 코드

my $line = "key: value"; 
my $replace = "option"; 

$line =~ s/([^:]+):/$replace/; 

은 $ 라인의 변수가 문자열 "option value"를 개최한다 주어진 교체와 정규식과 일치하는 어떤 대체합니다.

perldoc perlretut을 읽는 것이 유용 할 수 있습니다. 이

1

펄 -MYAPE :: 정규식은 "인쇄 YAPE을 -e 설명 :: :: 정규식을 ::들이 설명> ​​새로운 모든 문자와 일치하는 경우에/m에 옵션을 사용하지 않는 줄 바꿈을 제외한

*, ('([^ :] +) :') -> 설명 "

The regular expression: 

(?-imsx:([^:]+):) 

matches as follows: 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
(?-imsx:     group, but do not capture (case-sensitive) 
         (with^and $ matching normally) (with . not 
         matching \n) (matching whitespace and # 
         normally): 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    [^:]+     any character except: ':' (1 or more 
          times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    :      ':' 
---------------------------------------------------------------------- 
)      end of grouping 
----------------------------------------------------------------------