답변:
부정적인 둘러보기 사용 : (?!
pattern
)
긍정적 인 룩 어라운드를 사용하여 패턴이 일치하는지 확인할 수 있습니다. 부정적 룩 어라운드는 그 반대입니다. 패턴이 일치하지 않는다고 주장하는 데 사용됩니다. 어떤 맛은 단언을 지원합니다. 일부는 lookbehind 등에 제한을 둡니다.
이것들은 장난감 문제에 대한 정규식 솔루션을 연습으로 제시하려는 시도입니다. 둘러보기를 사용할 수있는 다양한 방법 (중첩, 캡처에 사용 등)을 배우려는 경우 교육적이어야합니다.
Pattern.compile("(?!(a.*b))").matcher("xab").matches()
이어야합니다 true
.
정규식과 완전히 일치하는 문자열 만 허용하지 않는다고 가정하면 (즉, mmbla
괜찮지 만 mm
그렇지 않습니다) 원하는 것은 다음과 같습니다.
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
부정적 예측입니다 . 그것은 "다음 몇 문자입니다 현재 위치로부터 개시라고 하지 mm
나 t
, 문자열의 끝 하였다." 시작 ^
부분 의 시작 앵커 ( )는 문자열의 시작 부분에 미리보기가 적용되도록합니다. 성공하면는 .*
계속 진행하여 문자열을 소비합니다.
참고로 Java의 matches()
방법을 사용 하는 경우 the ^
및 final이 실제로 필요 $
하지는 않지만 해를 끼치 지 않습니다. 그러나 $
내부 예측이 필요합니다.
.*
정규식 끝에 추가 해야한다는 것입니다. 그렇지 않으면 모든 문자열을 거부합니다.
$
안에서 음의 룩어과 .*
끝 모두 중요한 비트이다. 항상 RE와 마찬가지로 강력한 단위 테스트 세트는이를 올바르게 수행하는 데 절대적으로 중요합니다. 이 대답은 100 % 정답입니다.
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
이것은 주어진 정규식에 대한 것입니다.
\ b는 단어 경계를 찾는 것입니다.
긍정적 인 전망 (? = \ w)은 공백을 피하기 위해 여기에 있습니다.
원래 정규식에 대한 부정적인 전망은 일치를 방지하는 것입니다.
마지막으로 (\ w *)는 남은 모든 단어를 잡는 것입니다.
단어를 보관할 그룹은 그룹 3입니다
. 하위 문자열이
단순 ^ (?! (?: m {2} | t) $) 와 일치하므로 단순 (?! 패턴)은 작동하지 않습니다 . * $는 세분성이 전체 라인이므로 작동하지 않습니다.
{1}
완전히 쓸모가 없습니다. (당신이 그것이 어떤 가치를 제공한다고 생각한다면, 왜 쓰지((m{1}a{1}){1}|(t){1}){1}
않습니까?)