2012-09-18 3 views
2

지금은 2 단어 구문을 찾기 위해 "\\w+ \\w+"처럼 보이는 정규 표현식을 가지고 있지만 겹치지는 않습니다. 예를 들어 내 문장이 The dog ran inside 인 경우 "The dog", "dog ran", "ran inside"을 표시해야 할 때 출력에 "The dog", "ran inside"이 표시됩니다. 나는 이것을 할 수있는 방법이 있다는 것을 알고 있지만, 정규 표현식을 사용하는 방법을 알기에는 너무 새로운 방법이다.정규 표현식으로 겹치는 단어 집합을 어떻게 찾을 수 있습니까?

감사합니다.

+0

여기 정규식이 필요한 이유가 무엇입니까? 왜 단어 목록을 만들고 그 다음에 오는 모든 문자를 인쇄하지 않습니까? – DhruvPathak

+0

죄송합니다. Java Matcher and Pattern을 사용하여이 문서를 정렬하도록 지정 했어야합니다. 나는 정규식없이 이것들을 어떻게 처리 할 지 모른다. – rakoonise

+0

가능한 경우 코드를 게시하십시오 –

답변

0

전적으로 정규식으로는 불가능합니다. 동일한 문자를 두 번 일치시킬 수 없습니다 ("개"는 두 개의 개별 그룹에있을 수 없습니다). 그게 무슨 정확히 '에 대한 자세한 정보를 제공하시기 바랍니다 문제가 해결되지 않으면

>>> words = "The dog ran inside".split(" ") 
>>> [" ".join(words[i:i+2]) for i in range(len(words)-1)] 
['The dog', 'dog ran', 'ran inside'] 

: 이런 식으로 뭔가가 단순히 그러나 당신이 좋아 공백으로 문자열을 분리하고 결합 할 수 있습니다, 모든 정규식이 필요하지 않습니다 성취하려고 노력한다.

+0

Java 정규 표현식에 lookahead 어설 션이 포함되어 있으므로 물론 정규 표현식을 사용할 수도 있습니다. –

0

두 번째 단어를 얻으려면 미리보기를 사용하고 미리보기 부분과 미리보기가 아닌 부분을 연결하십시오.

# This is Perl. The important bits: 
# 
# $1 is what the first parens captured. 
# $2 is what the second parens captured. 
# . is the concatenation operator (like Java's "+"). 

while (/(\w+)(?=(\s+\w+))/g) { 
    my $phrase = $1 . $2; 
    ... 
} 

미안하지만, 충분한 자바를 모르겠다.하지만 이것은 자바에서도 쉽게 할 수 있어야한다.

+0

두 단어를 미리보기에 넣고 추가 문자열 연결이 필요하지 않은 이유는 무엇입니까? –

+0

@Tim Pietzcker, 나는/(? <=^| \ s) (? = (\ w + \ s + \ w +))/g'을 달성하기 위해 lookbehind를 사용할 수 있다고 생각한다. -quite equivalent'/ (? = (\ b \ w + \ s + \ w +))/g' – ikegami

0

쉬운 (빠른 큰 문자열을위한) 방법은 을 분할 사용하는 것입니다

final String[] arrStr = "The dog ran inside".split(" "); 
    for (int i = 0, n = arrStr.length - 1; i < n; i++) { 
     System.out.format("%s %s%n", arrStr[i], arrStr[i + 1]); 
    } 

넣어

The dog 
dog ran 
ran inside 

정규식 없음을 발견 트릭

1

이 작업을 수행 할 수 없다 미리보기, 캡처 그룹 및 단어 경계 앵커로 :

Pattern regex = Pattern.compile("\\b(?=(\\w+ \\w+))"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group(1)); 
} 
관련 문제