2008-11-10 3 views
1

의로는 SQL 쿼리의 속성 목록을 분할하는 현재 나는 다음과 같은 코드를 가지고 :자바 정규식은 문자열 []에 바인드합니다

: 대부분의 부품 작동하지만 다음 주어진 경우 실패

String select = qry.substring("select ".length(),qry2.indexOf(" from ")); 
String[] attrs = select.split(","); 

qry = "select a,b,c,DATETOSTRING(date_attr_name,'mm/dd/yyyy') from tbl_a"; 

내가 찾고있는 것은 String.split()에 피드를 제공하는 정규식이며 그 상황을 처리 할 것이고 다른 어떤 특별한 경우에는 내가 실종되었다고 생각할 수도 있습니다.

a,b,c,DATETOSTRING(date_attr_name,'mm/dd/yyyy'),f,gg,dr(tt,t,),fff 

마지막 'FFF'속성을 분할 실패,하지만 :

답변

1
[^,]+\([^\)]+\)|[^,]+, 

당신의 선택 문자열 ','그것은 잘 당신은 항상 마지막 추가 제공해야

a,b,c,DATETOSTRING(date_attr_name,'mm/dd/yyyy'),f,gg,dr(tt,t,),fff, 

이 캡처합니다. 따라서 약간의 전처리로 상황이 원활 해집니다.

주의 할 : 그건 당신이 처리 할 수있는 쿼리에서 발생할 수있는 경우이 표현식 내 계정 표현을 고려하지 않고는

EXP(arg1, EXP2(ARG11,ARG22), ARG2) 

은 말해.

주의해야 할 점은 비스 :이 분할 (예상 단순 분리), 당신은 패턴 [^,]+\([^\)]+\)|[^,]),에 따라 정규를 사용해야하며, 배열을 채우기 위해) (Matcher.find에 반복을 진정한 정규 표현식을 필요로하지 이후 속성은 attrs입니다.

간단히 말해서 split() 함수를 사용하면 트릭을 수행 할 수있는 간단한 구분자가 하나도 없습니다.

+0

는 요청 결과를 얻기 위해 분할. String # split은 전체 문자열과 일치하는 정규 표현식이 아니라 "separator"정규 표현식을 필요로합니다. – bdumitriu

2

귀하의 견적의 형태로 대답 : ". 내가, 내가 정규 표현식을 사용합니다 알고있다"는 문제에 직면했을 때

어떤 사람들, 생각 이제 그들은 두 가지 문제가 있습니다. - 제이미 Zawinski

당신의 정규식은 가능한 모든 기능, 중첩 된 기능, 중첩 된 문자열 등을 고려해야합니다. 당신의 솔루션은 아마도 정규 표현식이 아니고, 그것은 렉서 + 파서입니다.

+0

나는 낡은 "지금 당신은 두 가지 문제가있다"라는 말 때문에이 대답을 downvote하기 시작했다. 그러나 불행히도 대답은 정확하다. 정규 표현식은이 직업에 대한 잘못된 도구이다. 따옴표를 지금 쉬게 해 주시겠습니까? –

+0

정규식은 모든 유효한 SQL 문을 처리해야하는 경우 작업에 대한 잘못된 도구입니다. 제한된 특정 SQL 문 집합 만 분할해야하는 경우 작업에 적합한 도구입니다. 질문의 저자는 그가 실제로하려고하는 것에 대해 더 구체적이어야합니다. –

+0

SQL 쿼리는 정규식과 일치하기에 충분히 간단 할 수 있지만 앞으로 더 복잡해지지 않게하려면 무엇이 필요합니까? 이미 봉투를 밀고 있습니다. –

1

아마도 SQL parser으로 행운이 있습니다.

1

다른 사람들이 언급했듯이 이것은 실제로 더 복잡하고 단지 문자열 분할 또는 정규식 인 렉서 및 파서 문제입니다. 또한 사용중인 SQL의 버전과 사용하는 데이터베이스에 따라 SQL에서 끝낼 수있는 수많은 변형이 파서에 모든 종류의 톱니를 던져 버리는 경우가 있습니다. 마지막으로 할 일은 코드가 중단되는 추가 엣지 케이스를 발견 할 때이 코드 조각을 풀 타임 업무로 유지하는 것입니다.

나는 당신이 이 토큰 화에 의해 달성하려고하는 무엇 자신에게 다음과 같은 질문

  1. 물어 것인가? 무슨 문제가 해결하려고 입니까? 문을 구문 분석하지 않아도되는 간단한 솔루션이있을 수 있습니다.

  2. 모든 SQL 또는 대상 열/프로젝션 목록이 이 필요합니까? 나는 당신의 정규식이 문자열 번호에 공급 될 수 있다고 생각하지 않습니다