2016-07-06 5 views
5

ArrayList<String> 나는 문자열을 기준으로 올바른 색인을 찾기 위해 반복합니다. 기본적으로 문자열이 주어지면 프로그램은 목록을 검색하여 전체 단어가 일치하는 색인을 찾아야합니다. 예를 들면 :Java에서 문자열의 전체 단어 일치

ArrayList<String> foo = new ArrayList<String>(); 
foo.add("AAAB_11232016.txt"); 
foo.add("BBB_12252016.txt"); 
foo.add("AAA_09212017.txt"); 

내가 문자열 AAA을 제공 그렇다면, 내가 인덱스 2 (마지막)을 다시 받아야합니다. 그래서 색인 0을 돌려 줄 수 있으므로 메소드를 사용할 수 없습니다.

이 코드로 시도 :

String str = "AAA"; 
String pattern = "\\b" + str + "\\b"; 
Pattern p = Pattern.compile(pattern); 

for(int i = 0; i < foo.size(); i++) { 
    // Check each entry of list to find the correct value 
    Matcher match = p.matcher(foo.get(i)); 

    if(match.find() == true) { 
     return i; 
    } 
} 

불행하게도,이 코드는 결코 루프 내부의 if 문에 도달하지 않습니다. 내가 뭘 잘못하고 있는지 모르겠다.

참고 : AAA_0921, 전체 이름이 AAA_09212017.txt이거나 고유 한 문자열 부분을 검색 한 경우에도 작동해야합니다. 단어 경계는 단어 문자 사이에 일치하고 여기

String pattern = "(?<=_|\\b)" + str + "(?=_|\\b)"; 

필요 강조하지 않기 때문에

+2

이'_' 단어로 간주됩니다 참조하십시오 .. – rock321987

+0

오, 난 몰랐어. 다른 표현을 살펴 보겠습니다. – syy

+0

'return i;'를 의미하지 않습니까? – 4castle

답변

5

(?<=_|\b) 긍정적 인 lookbehind는 단어 경계 또는 str 전에 나타나는 밑줄을 필요로하며, (?=_|\b) 긍정적 예측은을 필요로 밑줄 또는 단어 경계가 str 바로 뒤에 나타날 수 있습니다.

this regex demo을 참조하십시오. 내부에 특수 문자가있을 수 있습니다 워드, 당신은 좀 더 직선적 단어 경계 사용할 수있는 경우

: 여기

"(?<![^\\W_])" + Pattern.quote(str) + "(?![^\\W_])" 

를 단어 문자는 제외하고있는 경우, 부정적인 lookbehind (?<![^\\W_])은 경기를 실패 밑줄 ([^...]은이 클래스 내에 정의 된 문자, 범위 등 이외의 문자와 일치하는 부정 문자 클래스이므로 단어가 아닌 문자 \W_ 이외의 모든 문자와 일치 함) 및 (?![^\W_]) 부정적 미리보기 str 뒤에 밑줄을 제외하고 단어가 char 인 경우 일치하지 않습니다.

두 번째 예제에는 인용 검색 문자열이 있으므로 AA.A_str.txtAA.A과 잘 일치 할 수 있습니다.

은 늘 단어 경계 역할을 character..so another regex demo

+0

대단히 감사합니다! 이것은 그것을 작동하게했다. 표현의 다른 부분을 설명 할 수 있습니까? 나는'regex'를 처음 접했습니다. 그렇지 않다면, 괜찮아요. 나는 그것을 볼 수 있습니다. – syy

+1

@Flow 훌륭한 도구는 [regex101.com] (http://www.regex101.com)입니다. 오른쪽 상단 패널을 보면, 당신이 그것을주는 정규식을 설명합니다. 자바 정규 표현식을 지원하지는 않지만 일반적으로 PCRE와 거의 유사합니다. – 4castle

+2

기차 칸막이에있는 노트북으로 아들과 싸우고 있습니다. 물론 시도해 보겠습니다. –