regex VS "string".contains("anotherString")
및/또는 다른 String API 호출을 사용하는 경우 일반 지침이 있는지 궁금합니다.정규 표현식 VS 연습 반복을위한 모범 사례
.contains()
에 대한 위의 결정은 간단합니다 (단 한 번의 호출로이 작업을 수행 할 수 있다면 정규 표현식을 왜 귀찮게하는지). 실제 생활은 더 복잡한 선택을합니다. 예를 들어 두 개의 .contains()
호출 또는 단일 정규식을 수행하는 것이 더 좋습니까?
나의 어법은 단일 API 호출로 대체 할 수 없다면 항상 regex를 사용하는 것이 었습니다. 이렇게하면 코드가 부풀어 오르는 것을 막을 수 있습니다. 코드 가독성 측면에서 보면별로 좋지 않을 수 있습니다. 특히 정규 표현식이 커지는 경향이있는 경우에는 특히 그렇습니다.
흔히 간과되는 또 다른 주장은 성과입니다. 이 정규 표현식을 사용하려면 얼마나 많은 반복 ("Big O"에서처럼)이 필요한지 어떻게 알 수 있습니까? 반복되는 것보다 더 빠릅니까? 어떻게 든 모든 사람들은 정규 표현식이문장보다 짧아지면 더 빠르다고 가정합니다. 하지만 항상 그렇습니까? regex를 사전에 미리 컴파일 할 수없는 경우 특히 유용합니다.
귀하의 대답은 전혀 이해가되지 않습니다. 이 정규 표현식은 "th"가 발생했을 때 약간의 여분의 논리만으로 문자열을 통해 한 번의 선형 검색을 수행하고이 첫 번째 일치에서 중지합니다. 두 개의 contains() 호출은 문자열을 통해 두 개의 선형 검색을 수행하므로 첫 번째 단어가 들어 있지 않은 경우 전체 문자열을 검색해야합니다. 항상 성능이 저하됩니다. . * this. * |. *. *. *는 처음부터. *가 전체 문자열과 끝까지 일치하므로 단어를 찾기 위해 역 추적하기 때문에 훨씬 간단하게 만드는 것보다 명확하게 최적화되지 않습니다. –
최악의 경우는 같은 방법으로 모든 패턴이 관련 문자 위치마다 시도됩니다. 소수의 직선 검색의 경우 "this | that"에 더 최적의 사례가 있습니다 (예 : 'that'는 문자열에 있지만 'this'에는 없음). 패턴의 목록이 증가하고 잘못된 시작의 기회가 커지면 변경됩니다. 이 경우에는 아마 기지를 벗어 났을 것입니다. 직접적인 문자 일치는 항상 정규 표현식을 선호 할 수 있습니다 (Java의 특정 구현은 경험을 통해 수백 가지 패턴에 대해 비정상적으로 수행하는 것처럼 보이지만). – PSpeed
그 자체가 비싸지 않은 비 문자 패턴의 경우, 하나의 큰 정규식 대신에 여러 별도의 연산을 수행하는 데 비용을 지불 할 수 있습니다. 특히 가장 초기의 일치 (위치 별)를 신경 쓰지 않는 경우 특히 그렇습니다. – PSpeed