문제

나는 현재 "-"로 분리 된 단어가 포함 된 텍스트 파일을 필터링하려고합니다. 나는 단어를 세고 싶다.

scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));

단순히 발생하는 문제는 다음과 같습니다. "-"를 포함하는 단어는 분리되어 두 단어로 계산됩니다. 따라서 -로 탈출하는 것은 선택의 해결책이 아닙니다.

"foo-bar"와 같은 단어가 머무를 수 있도록 구분 기질 발현을 어떻게 바꾸려면 "-"만 필터링되고 무시 될 수 있습니까?

감사 ;)

도움이 되었습니까?

해결책

좋아, 나는 여기에서 당신의 질문을 추측하고있다 : 당신은 당신이 "실제"산문이있는 텍스트 파일, 즉 실제로 의미가있는 문장이 구두점 등으로 분리되어 있다는 것을 의미합니까?

예시:

이 상황은 우리가 가장 신뢰할 수있는 동맹국 인 Vorgons가 계속해서시 슬램 경연 대회를 개최한다는 사실에 의해 개선됩니다. 적은 음소거 한 장치를 사용하더라도이를 방해 할 인센티브가 거의 없습니다.

따라서, 당신이 구분 기자로 필요한 것은 어느 정도의 공백 및/또는 구두점 (이미 보여준 regex로 덮은) 또는 각 측면에서 하나 이상의 공백으로 둘러싸인 하이픈입니다. "또는"is "|"에 대한 Regex 캐릭터. 많은 Regex 구현에는 " s"에 Whitespace 문자 클래스 (공백, 탭 및 Newlines)에 대한 단축키가 있습니다.

"[.,:;()?!\"\s]+|\s+-\s+"

다른 팁

가능한 경우 사전 정의 된 클래스를 사용해보십시오 ... Regex를 훨씬 쉽게 읽을 수 있습니다. 옵션은 java.util.regex.pattern을 참조하십시오.

어쩌면 이것은 당신이 찾고있는 것입니다.

string.split("\\s+(\\W*\\s)?"

읽기 : 선택적으로 1 개 이상의 공백 숯을 일치시킨 다음 비 단어 문자 및 공백 문자가 뒤 따릅니다.

이것은 그리 간단하지 않습니다. 시도해야 할 것은 {current-delimeter-chars} {Zero-or-more-Hyphens} {Zero-or-more-Current-rars-or-hyphen}입니다.

전적으로 하이픈으로 구성된 스캐너로 반환 된 단어를 무시하는 것이 더 쉬울 수 있습니다.

Scanner scanner = new Scanner("one   two2  -   (three) four-five - ,....|");
scanner.useDelimiter("(\\B+-\\B+|[.,:;()?!\" \t|])+");

while (scanner.hasNext()) {
    System.out.println(scanner.next("\\w+(-\\w+)*"));
}

NB

다음 (문자열) 메소드는 원래 usedelimiter () 메소드가 "|"이후로 단어 만 얻는다고 주장합니다.

NB

정규 표현식 " r n | n"을 라인 터미네이터로 사용했습니다. java.util.regex.pattern의 javadocs는 다른 가능한 라인 터미네이터를 보여 주므로보다 완전한 점검은 " r n | [ r n u2028 u2029 u0085]라는 표현을 사용합니다.

이것은 충분히 간단해야합니다. [^\\w-]\\W*|-\\W+

  • 그러나 물론 산문이면 배제하고 싶다면 밑줄:
    [^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
  • 또는 숫자를 기대하지 않는 경우 :
    [^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+

편집하다: 이것들은 더 쉬운 형태입니다. 선의 시작과 끝에서 대시를 처리하는 완전한 솔루션을 명심하십시오.이 패턴을 따릅니다. (?:^|[^\\w-])\\W*|-(?:\\W+|$)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top