정확하게 이해하면, Foo
또는 Bar
이 아닌 모든 단어를 캡처 한 다음 어떻게 든 인쇄 할 수 있습니다.
/
(?<!\S) # match cannot be preceded by non-whitespace
(?!Foo|Bar)(\S+) # capture non-whitespace that is not Foo|Bar
(?!\S) # match cannot be followed by non-whitespace
/gx # match globally and ignore whitespace in regex
주 /x
즉, 그래서 주석을 사용 할 수 있습니다 단지가 :
보기보다 덜 복잡
/(?<!\S)(?!Foo|Bar)\S+(?!\S)/g
, 여기에 주석 버전입니다 :이 그런 일을 할 수있는 하나 개의 방법이 될 것입니다 정규식 내부의 개행 문자.
이 정규식의 시작과 끝 부분은 경계 앵커입니다. 우리는 부분적으로 일치하지 않는지 확인하기 위해 이것을 사용합니다. 그것들은 부정적인 look-around 어설 션이고 다소 더 단순한 \b
단어 경계 어설 션을위한 대체 코드입니다. 문자열에 쉼표 문자가 있기 때문에 \b
을 사용할 수 없습니다. 대신에 (?!\S)
을 사용하는 이유는 둘 다 공백과 일치하지만 후자는 문자열의 시작/끝과 일치하지 않기 때문입니다.
우리는 부분 일치를 얻을 수 없다는 것을 확신 했으므로 이제 앵커 내부에서 간단한 미리보기를 사용하여 또 다른 부정적 미리보기 단정을 사용할 수 있습니다. 나는. (?!Foo|Bar)
. 일치하지 않으면 (\S+)
문자열을 캡처합니다. 이 $_
(입력)에서 문자열을 캡처 배열 참조 내부 @a
어레이에이를 밀어 우리 정규식을 사용
perl -nlwe 'push @a, [/(?<!\S)(?!Foo|Bar)(\S+)(?!\S)/g] }{ print "@$_" for @a'
The Foo bar, and Bar foo needs to Foo
The Bar of Bar foo Bar Foo Foo
Bar bar The Bar of Foo other Foo Bar
^Z
The bar, and foo needs to
The of foo
bar The of other
: 여기
는 I이 문제에 대해 생성 된 테스트 케이스이다. 입력이 끝난 후 (eskimo 연산자
}{
다음) 보간 된 배열 참조를 인쇄하여 공백을 추가합니다. 이 경우
"@$_"
은
join " ", @$_
과 같습니다.
출처
2013-08-31 12:16:22
TLP
+1 나는 그가 그걸 요구하고 있다고 믿는다. – ChicagoRedSox
@ChicagoRedSox 당신은 그가 그 말을하도록 이끌어 낸 사람이었다. 그래서 당신은 +1했다. – TLP