2012-07-12 3 views
3

배열이있어서 "test"(예 :)로 시작하는 문자열을 검색하려고합니다. 이 집합 접두사를 검색하는 가장 효율적인 방법은 무엇입니까? 정규식 또는 if 문?Java : 정규식 대 if 문

정규식 : 가장 효율적인

for (String line : ArrayList) { 
     if (line.startsWith("test"){ 
      doSomething(); 
      } 

:

boolean found = false; 
    for (String line: ArrayList){ 
       Pattern pattern = 
       Pattern.compile("^test"); //regex 

       Matcher matcher = 
       pattern.matcher(line); 


       while (matcher.find()) { 
        found = true; 
       } 
       if(found){ 
        doSomething(); 
         } 
        } 
       } 

if 문?

긴 문자열에 가장 효과적인 방법은 무엇입니까?

"test"로 시작하지만 "test"다음에 "foo"가있는 문자열 만 찾으려면 어떤 방법이 더 좋습니까?

Regex가 답변이라면 "test"로 시작하고 "foo"또는 "bar"로 시작하는 두 가지가 아닌 올바른 구문 구문은 무엇입니까?

+5

이 IMO에 대한 정규식 ... –

+1

그냥 보조 노트 너무 많이 : 그것은 여기에 정규 표현식을 사용하는 감각을 만들 것입니다 경우에도, 당신은 루프 외부 패턴을 컴파일해야한다. – Thomas

+1

하나의 블록이 더 많은 접두사를 담당해야하는 경우가 있다면 ['StringUtils.startsWithAny (String string, String [] searchStrings)'] (http://commons.apache.org/lang/api- 2.5/org/apache/commons/lang/StringUtils.html) –

답변

4

그냥 startsWith을 사용하십시오. Regex는 선행 공백이있는 문자열을 허용하지 않으려면 약간 과잉입니다.

startsWith은 "test"또는 "testfoo"로 작업 할 수 있습니다. "foo""test" (즉, "testokokokfoonothing") 이후 입력의 아무 곳에 나 나타날 수 있다는 것을 의미하는 경우 여기에 정규식을 사용해야합니다. 전체 입력이 정규식과 일치하는 경우 그래서 정규식에 대한 수정의 비트가 필요하다

for (String line: ArrayList){ 
    if (line.matches("^test.*") { 
     doSomething(); 
    } 
} 

matches() 검사 :

은 정규식 버전에 대한 귀하의 코드로 단축 할 수있다. 위의 코드는 Pattern이 다시 컴파일되므로 약간 느립니다.

1

IF 문을 좋아합니다. 개인적으로 Regex는 가능한 한 피합니다. 코드 작성이 복잡하고 어렵습니다. 코딩과 관련해서는 가장 중요한 것 중 하나가 유지 보수이며 Regex에서는이를 제공하지 않습니다.

if 문을 사용하십시오.

+1

그게 달려 있습니다. regex를 사용하여 쉽게 이해하고 코드를 작성하고 읽을 수있는 경우가 있습니다. – Thomas

+0

어쩌면,하지만 당신이 말한 것처럼 IF, 당신은 그들을 이해합니다. 코드를 작성할 때 항상 코드를 유지 관리하는 것은 아닙니다. 그러므로 모든 사람들에게 가장 쉬운 것을 사용하고 싶습니다. Regex를 사용하는 방법을 아는 유일한 사람이라면 쉽게 작업 할 수있는 유일한 사람이 될 것이며 좋은 연습이 아닙니다. – BlackHatSamurai

2

정규 표현식은 상당한 오버 헤드가 발생합니다. startsWith과 같은 "직접적인"구현이있는 무언가를한다면 거의 항상 빠릅니다.

6

4 줄의 코드와 16 줄의 비교? 더 빠르게 실행되는 것에 신경 쓰지 마라. 4 줄 버전은 쓰기가 더 효율적이고, 유지하는 것이 더 효율적이다.

일부 코드가 있고 벤치마킹 한 후 특정 병목 지점을 확인한 경우에는 더 복잡한 코드를 작성하거나 매번 간단한 버전으로 이동하는 것이 좋습니다.

+0

"foo 이상을 찾고 싶다면 각각 어떻게됩니까? "(~ 20 개의 다른 접미어) 또는"테스트 "이상의 것일까 요? if 문에 OutOfMemory 오류가있어서이 질문을했습니다. –

+1

좀 더 복잡한 것이 있다면 정규 표현식과 같은 것이 적절할 수도 있지만 실제로하고있는 것에 달려 있습니다. 질문에 대한 대답은'line.startsWith (...)'를 사용하는 것입니다. – Duncan

1

startsWith()를 선호합니다. 보다 관용적이며 간결하며, 비효율적 인 정규 표현식을 작성하는 것이 상대적으로 쉽기 때문에, 특히 java.util.regex를 사용하면 더 빠르게 구현할 것 같지 않습니다.

일반적으로 String 객체의 표준 메소드가 충분하지 않은 경우에만 java.util.regex를 사용해야합니다.

인 경우 Regex 코드에 몇 가지 메모를 사용하면 정규식을 사용하여 루프 내에서 Pattern.compile을 실행하지 않아야합니다.

if (matcher.find()) { 
    doSoemthing(); 
} 
0

yopu이해야 할 첫 번째 일이 : 컴파일 시간을 먹기 때문에 for 외부 Pattern pattern = Pattern.compile("^test"); //regex을 넣고 한 번만해야 할 당신은 말에 의해 더 코드를 단순화 할 수 있습니다.

Pattern pattern = Pattern.compile("^test.*"); //regex 
    for (String line: ArrayList){ 
     if(patter.matches(line)){ 
      oSomething(); 
     } 
    }