구분 기호가있는 스캐너를 사용 중이며 이상한 행동을 보았습니다. 이해하고 싶습니다.스캐너에서 useDelimiter 사용 : 왜 공백 토큰을 얻습니까?
Scanner sc = new Scanner("Aller à : Navigation, rechercher");
sc.useDelimiter("\\s+|\\s*\\p{Punct}+\\s*");
String word="";
while(sc.hasNext()){
word = sc.next();
System.out.println(word);
}
출력은 다음과 같습니다 :
나는이 programm에 사용하고 난 빈 토큰을 받고 있어요 왜 그렇게 처음에는 이해가 안
Aller
à
Navigation
rechercher
을의 documentation는 말한다 :
구분 기호 유형에 따라 빈 토큰이 반환 될 수 있습니다. 예를 들어, "\ s +"패턴은 구분 기호의 여러 인스턴스와 일치하므로 빈 토큰을 반환하지 않습니다. 구분 패턴 "\ s"는 한 번에 하나의 공백 만 전달하기 때문에 빈 토큰을 반환 할 수 있습니다.
\\s+
나는 공백 토큰을 반환하는 이유는 무엇입니까?
그러면 정규식에 관해서 내가 알고 싶은 또 다른 것이 있습니다.
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+");
출력은 정확하고 내가 얻을 :
Aller
à
Navigation
rechercher
를이 방식으로 작동하는 이유는 정규식을 "반전"를 사용하여 구분 기호를 변경하는 경우?
편집 :이 케이스
:
Scanner sc = new Scanner("(23 ou 24 minutes pour les épisodes avec introduction) (approx.)1");
sc.useDelimiter("\\s*\\p{Punct}+\\s*|\\s+"); //second regex
난 아직도 introduction
와 approx
사이에 빈 토큰을 가지고있다. 그것을 피할 수 있습니까?
공백이 있고 문장 부호가 뒤에 오는 곳에 두 개의 구분 기호 캡처가 발생한다고 생각합니다. 간단히''[\\ s \\ p {Punct}] +''를 사용하지 않을까요? 아니면 문제를 지나치게 간소화하고 있습니까? –
@HovercraftFullOfEels 감사합니다 당신의 정규식은 내 요구에 완벽합니다! 나는'\\ s + | \\ p {Punct} +'(이 말로 시작했지만 언급하지 않았다)가 당신의 것과 똑같이하고 있다고 생각했지만 왜 그런 것이 아닌가? –
그리고 여전히 \\ s * \\ p {Punct} + \\ s * | \\ s +'와'\\ s + | \\ s * \\ p {Punct}의 차이에 대한 설명을 찾고 있습니다. } + \ s *' –