2013-06-15 7 views
0

^및 $을 제거 할 때 다음 RegEx 만 작동하는 이유는 무엇입니까?긍정적 인 해결책으로 문제가 생기기

^(?<=.).+(?=.)$ 

출처 : #Hello World#
대상 : Hello World

해결책을 찾는 기대.
미리 감사드립니다.

+0

아마도 실제 실행중인 코드가 도움이 될 것입니다. 그리고 아마도 어떤 언어가 ... – AngelWarrior

+0

StringITF와 함께 AutoIT를 사용하고 있습니다. [RegExr] (http://regexr.com?3584m)로 테스트하기 – Tigerix

답변

4

이 lookarounds은 앵커와 함께 작동하지 않을 수 있습니다.

^은 문자열의 시작이 있음을 주장한다 (그러나 엔진의 "커서"의 위치를 ​​진행하지 않습니다). 그런 다음 (?<=.)은 그 위치에서 남은 문자가 있다고 주장합니다. 그것은 모든 경우에서 모순입니다 (거의 다음 절을보십시오). (?=.)$도 마찬가지입니다.

멀티 라인 모드 (m)에서 ^$은 문자열의 다른 지점, 특히 각 행의 시작과 끝에서 일치 할 수 있습니다. 이 경우 그 위치 (줄 바꿈 문자)의 앞이나 뒤에 다른 문자가 있습니다. 그러나 줄 바꿈 문자는 . (대부분의 엔진), 과 일치 할 수 없습니다.도 단일 줄 또는 "도트"모드 (s)를 사용하지 않는 한. 따라서 정규 표현식이 일치 할 수있는 유일한 경우는 ms을 모두 사용하는 경우입니다. 거기에 다른 문자,하지만 문자 (바로 문자열의 끝으로 둘러싸인) 주장

(?<=^.).+(?=.$) 

:

은 당신이 아마 찾고있는 것은 이것이다.

(?=.)$(?=.$) 사이에 차이가 이유도 명확해야한다. Lookarounds 엔진의 "커서"위치를 앞지 마십시오. 즉, (?=.)$의 경우 엔진은 현재 위치에 다른 문자가 바로 따라 갔는지 확인합니다. 그 중 하나가 만족스럽고 미리보기가 남아있는 경우 엔진은 여전히 ​​동일한 위치에 있습니다 (이것이 의 모양이 인 이유입니다). 앞으로). 그러므로 앵커를 둘러보기에 넣어야하기 때문에 "커서"의 위치를 ​​재설정하기 전에 앵커를 실제로 확인해야합니다.

More information on lookaround.

+0

자세한 설명을 주셔서 감사 드리며,이를 머리에 정리해 주셨습니다. 내 표현에는 논리 실수가 있어야한다는 것을 알았지 만 해결하지 못했습니다. – Tigerix

1

^(?<=.).+(?=.)$ 문자열 경기

  • 을하기 전에 (즉, 경기의 일부가 아닌) 문자가 앞에
  • 의 시작 부분과 끝 부분에 고정

    • 뒤에있는 문자열과 일치하는 말처럼 경기 종료 후 문자 (일치 항목이 아님)

    모순입니다. 문자열이 처음에 고정되기를 원한다면, 그 앞에는 어떤 문자도 올 수 없습니다. 끝에 앵커에 대한 반대도 마찬가지입니다.

  • 0

    귀하의 정규식 패턴이 아무 의미가 없다 (또한 해당 페이지의 사이드 바에서이에 두 번째 부분이) :

    ^ means the begining of the string 
    $ means the end of the string 
    
    (?=....) means followed by (lookahead) 
    (?<=....) preceded by (lookbehind) 
    
    첫 번째 부분

    : 당신이되지 않은이 원인 ^(?<=.) 실패 lookbehind 앞의 문자들, 단지 문자열의 처음 문자

    마지막 부분 : (?=.)$ 같은 문제는 lookahead 다음에 어떤 문자도 없으므로 실패합니다.

    관련 문제