2012-04-28 5 views
1

정규식 검색 방법을 연습하고 있으므로 SQL 삽입 문에서 테이블 이름을 추출하려고합니다. 나는 (?<=INSERT INTO)\w+(?= (\(|VALUES).+) 정규식을 가지고 있고 문자열 INSERT INTO tests VALUES (regex, test)에서 테스트 할 것이다. 정규식이 꼼꼼하게 수행되지 않았다는 것을 알고 있지만, 입력 한 부분 문자열의 tests과 일치 할 것으로 기대합니다.Regex : String.split 및 Pattern.matches가 서로 일치하지 않습니다.

자바의 정규식 엔진을 사용하고 있는데 String.split을 정규식에 넣었을 때와 내가 Pattern.matches을 정규식으로 사용할 때의 결과를 인쇄하고 있습니다. 나는 다음과 같은, 겉으로-모순 그냥 기록에이를 얻기 위해 지금

regex> (?<=INSERT INTO)\w+(?= (\(|VALUES).+) 
string> INSERT INTO tests VALUES (regex, test) 
[INSERT INTO , VALUES (regex, test)] 
regex> (?<=INSERT INTO)\w+(?= (\(|VALUES).+) 
string> INSERT INTO tests VALUES (regex, test) 
false 

를 두 번째는

Pattern.matches(regex, searchString) 
에서 온 반면, 첫 번째 결과를 생성 한 코드가

Arrays.toString(searchString.split(regex)) 

되는 결과를 얻을 수

split은 일치하는 문자열을 인수로 나눕니 까? 즉, 정규 표현식이 tests과 일치하므로 결과는 [INSERT INTO , VALUES (regex, test)]입니다. 그럼, 왜 Pattern.matches은 false를 반환 했습니까? 내가 놓친 것 없니?

+0

'Pattern.matches'는 전체 문자열을 검색하는 데 사용되지 않습니까? 귀하의 경우 lookarounds 정말 '일치',하지만 테스트되지 않습니다. –

답변

1

조안나의 대답에 조금 더 덧붙이면 : 룩어 헤드와 시선은 경기에 참여하지 않습니다. Pattern.matches은 문자열의 시작 부분부터 시작하여 끝까지 모든 정규식이 시작되도록 정규식 일치를 요구합니다. 긍정적 인 표정 (INSERT INTO)을 가졌으므로 처음에는 일치하지 않는 text에서 경기가 시작됩니다. 마찬가지로 끝에있는 미리보기는 끝에 일치가 없음을 의미합니다.

split은 일치 항목이 처음부터 시작하지 않아도되기 때문에 예상대로 작동합니다.

4

당신은 당신이 사용하는 경우 같은 문제를 얻을 수 있다면 시도 것 :

Pattern p = Pattern.compile(yourRegex); 
Matcher m = p.matcher(inputString); 

Pattern.matches 사실 m.find() 반환 전체 문자열이 일치 할 것으로 예상 있는지 확인 - 그것은 lookarounds에 문제가있을 수 있습니다 이들은 제로 폭 (zero-width) 어서션이고 일치 된 문자는 버려지기 때문이다.

+0

답변을 주셔서 감사합니다. 그러나 알란이 더 유익하다는 것을 알았습니다. (-,) – skytreader

관련 문제