[Java] 문자열내 원하는 문자(열) 찾기

Study/Java 2019. 6. 6. 10:57 Posted by meanoflife
반응형

문자열 내에 '찾고자 하는 문자열'을 검색하는 프로그램입니다.

 

프로젝트에서 소스파일을 읽어, 해당 소스내에 있는 문자열을 찾거나 변경할 때 사용하였습니다.

설계단계에서는 소스에서 특정 문자열을 도출하여 분석자료로 사용하였고,

개발단계에서는 문자열을 변경하거나 특정 위치에 일괄작업을 하기 위한 용도로 사용하였습니다.

 

문자열을 찾고 prefix( 앞문자 )와 postfix( 뒷문자 )를 체크하여, 찾는 문자열인지 판단합니다.

단어내에 찾는 문자열이 포함되어 있을 경우( 예시의 "111AAA222" )는 제외하기 위함입니다.

 

이 후 확장성을 고려하여, 체크유형코드를 추가하여 사용하였습니다.

예시에서는 '01'코드만 사용하였으나, 각 Case별로 예외처리 문자를 관리한다면 범용적으로 사용할 수 있습니다.

예외처리 문자는 prefix나 postfix문자에 문자가 있어도 찾는 문자로 인식하기 위한 용도입니다.

프로젝트에서는 PL/SQL을 대상으로 사용하였는데, 특정 테이블 검색시 OWNER.TABLE_NAME 형태로 되어 있기 때문에

TABLE_NAME 앞에 있는 prefix문자 '.'은 체크에 무시하기 위해 예외처리 문자로 지정하였습니다.

	public static void main(String[] args) {
		
		String strContext = "111AAA222 AAA FFFF AAA";
		boolean bFind = findWord( strContext, "AAA", "01" );
		
		System.out.println( "문자 포함여부 : " + bFind );
	}
	
	/**
	 * 문자열 내에 "찾는 문자열"이 포함되어 있는지를 체크한다.
	 * 
	 * @param strContext  : 검색 대상 문자열
	 * @param strFindWord : 찾을 문자열
	 * @param strDscd
	 * 		- [00] N/A  : 문자열이 포함된 경우
	 * 		- [01] 일반 : prefix와 postfix에 다른 문자가 없는 경우 
	 * @return
	 */
	private static boolean findWord( String strContext, String strFindWord, String strDscd ) {
		
		boolean bFind = false;
		int iFindCnt = 0;
		
		if( !strContext.contains( strFindWord ) ) return bFind;
		
		// 찾을 문자열이 포함되어 있으면, 동일 문자인지 체크한다.
		int iStIdx = -1;
		int iEdIdx = -1;
		
		String strTmp = strContext;
		String strFind = "";
		
		boolean bPrePost = false;
		
		while( strTmp.contains( strFindWord ) ) {
			
			iStIdx = strTmp.indexOf( strFindWord );
			iEdIdx = strTmp.indexOf( " ", iStIdx );  // 시작문자 이후의 " "공백문자 검색
			
			if( iEdIdx == -1 ) iEdIdx = strTmp.length();  // 시작문자 이후에 공백문자가 없으면, 문자열 끝까지.
			
			// prefix체크와 Postfix 처리( strDscd에 따라 처리 )
			bPrePost = chkPrePostfix( strDscd, strTmp, strFindWord );
			
			if( bPrePost ) {
				strFind = strTmp.substring( iStIdx, iEdIdx );
				
				if( strFind.equals( strFindWord ) ) {
					bFind = true;
					iFindCnt++;		// 찾는 문자열 횟수
				}
			}
			
			strTmp = strTmp.substring( iEdIdx );
		}
		
		if( bFind ) System.out.println( iFindCnt + "건의 문자열이 포함되어 있습니다." );
		else System.out.println( "찾는 문자열이 없습니다." );
		
		return bFind;
	}

찾는 문자열의 앞/뒤 1글자를 추출하여 비교합니다.

찾는 문자열 앞/뒤에 다른 문자가 있다면, 문자열 내에 포함된 문자로 인지하여 추출에서 제외합니다.

	/**
	 * 체크유형별 Prefix와 Postfix 문자열을 체크하여, 찾는 문자열인지 여부를 Return한다.
	 * 
	 * @param strDscd
	 * @param strContext
	 * @param strFindWord
	 * @return
	 */
	private static boolean chkPrePostfix( String strDscd, String strContext, String strFindWord ) {
		
		boolean bResult = false;
		boolean bPre = false;
		boolean bPost = false;
		
		String strPre = "";
		String strPost = "";
		
		/*
		 * Prefix Check
		 *   : 찾는 문자열의 '앞'문자가 없거나( 공백 포함 ) 지정한 문자( arrPreFix )문자이면 True.
		 */
		
		int iStIdx = strContext.indexOf( strFindWord );
		
		ArrayList<String> arrPrefix  = getExceptionChar( strDscd, true );
		ArrayList<String> arrPostfix = getExceptionChar( strDscd, false );
		
		if( iStIdx == 0 ) bPre = true;
		else strPre = strContext.substring( iStIdx - 1,  iStIdx ).trim();
		
		if( strPre.isEmpty() || arrPrefix.contains( strPre ) ) bPre = true;
		
		/*
		 * Postfix Check
		 *   : 찾는 문자열의 '뒤'문자가 없거나( 공백 포함 ) 지정한 문자( arrPostFix )문자이면 True.
		 */
		
		int iEdIdx = 0;
		
		if( iEdIdx == strContext.length() ) bPost = true;
		else strPost = strContext.substring( iEdIdx, iEdIdx + 1).trim();
		
		if( strPost.isEmpty() || arrPostfix.contains( strPost ) ) bPost = true;
		
		// prefix와 postfix가 모두 true이면, 찾는 문자열
		if( bPre && bPost ) bResult = true;
		
		return bResult;
			
			
	}

앞/뒤 문자 체크시 예시와 같이 예외처리 문자를 지정하여, 해당 문자는 체크에서 제외하였습니다.

	/**
	 * 체크유형별 Prefix와 Postfix 체크시 예외처리할 문자를 세팅한다.
	 * 
	 * @param strDscd : 체크유형
	 * @param bPrefix : Prefix 여부( true : prefix, false : postfix )
	 * @return
	 * 	- ArrayList<String> : 체크유형별 예외처리 문자
	 */
	private static ArrayList<String> getExceptionChar( String strDscd, boolean bPrefix ) {
		
		ArrayList<String> arrResult = new ArrayList<String>();
		
		// 체크유형( 01:일반 )
		if( strDscd.equals( "01" ) ) {
			
			// prefix
			if( bPrefix ) {
				arrResult.add( "." );
				arrResult.add( "/" );
			}
			// postfix
			else {
				arrResult.add( "/" );
			}
		}
		
		return arrResult;
	}
    

 

반응형