2013-08-18 2 views
-1

코드의 정규 표현식 입력 문자열 "고양이 고양이 고양이 cattie 고양이"에서 "고양이"부분 문자열의 발생을 찾을 수 있습니까 것 모두에서 정규 표현식의 장점은 무엇입니까?

String inpuTwo = "cat cat cat cattie cat"; 
    int lastIndex = 0; 
    int count = 0; 
    while (lastIndex != -1) { 
     lastIndex = inpuTwo.indexOf("cat", lastIndex); 
     if (lastIndex != -1) { 
      count++; 
      lastIndex += findStr.length(); 
     } 
    } 
    System.out.println("Match number " + count); 

코드

String inputOne = "cat cat cat cattie cat"; 
    String findStr = "cat"; 
    Pattern p = Pattern.compile("cat"); 
    Matcher m = p.matcher(inputOne); 
    int countOne = 0; 
    while (m.find()) { 
     countOne++; 
    } 
    System.out.println("Match number " + countOne); 

문자열 비교.

제 질문은 무엇입니까?

문자열 비교에 비해 정규 표현식의 장점은 무엇입니까?

응용 프로그램에 사용해야하는 것은 무엇입니까? 정규식 또는 문자열 비교?

감사합니다.

+3

짧고 중요합니다. – arynaq

+0

문자열에서 이메일 주소를 찾지 않으면 어떻게됩니까? 당신은'@'의 어커런스를 찾을 수 있다고 주장 할 수 있습니다. 그러나'@'는 전자 메일 주소의 컨텍스트 외부에서도 발생할 수 있습니다. 문제를 해결할 수있는 정규 표현식을 찾을 때까지 복잡해진다. – adarshr

+0

@adarshr @를 가설 적으로 반복하고 @와 같은 특정 문자가 이미 일치하는지 확인하는 플래그로 확인하십시오. 그것은 결코 좋은 생각이 아닙니다. – hexafraction

답변

13

두 가지가 완전히 다르므로 답변은 당면 과제에 많이 달려 있습니다.

metacharacters없이 정규 표현식을 사용하는 경우 문자열 기반 비교를 사용하십시오. 이해하기 쉽고 속하지 않는 곳에서 복잡성을 유발하지 않습니다 (here is a link to an article that explores this point in depth).

정규 표현식은 메타 문자를 사용하여 시작됩니다. 캡처 할 문자열을 하나씩 나열하는 대신 정의해야하는 경우 정규 표현식을 사용해야합니다.

+0

regexp는 내부적으로 문자열 비교를 사용합니까? – Prabhakaran

+3

@Prabhakaran 가능성이 높습니다. 정규식 엔진은 일반적으로 입력을 인식하는 최종 상태 자동 완성을 작성합니다. Java에서는 'Pattern.compile'을 호출 할 때 자동 완성 기능이 구현됩니다. – dasblinkenlight

+0

@Prabhakaran "문자열 기반 비교"에 의해 올바른 것은'문자열 '을 문자의 시퀀스로 해석하는 ('replaceAll' 및 문자열을 정규 표현식으로 해석하는'split (String)'). – dasblinkenlight

1

정규식은 복잡한 작업을 수행하는 것처럼 특수한 경우에 대비하여 내장 된 기능이 충분하지 않을 때 유용합니다. 하지만 어떤 경우에는 inbuilt 함수 나 regex를 사용할 수 있습니다. 또한 정규 표현식을 사용하면 코드가 단축되고 효과적 일 수는 있지만 생각하는 코드의 가독성이 떨어집니다.

+0

고맙습니다 @ 루키 라. – Prabhakaran

3

예를 들어, 어느 쪽이든 괜찮습니다. 정규 표현식 1은 읽기에는 약간 명확하지만 중요하지는 않습니다.

정규식의 진정한 이점은보다 복잡한 작업이 필요할 때입니다. 예를 들어 비 정규 표현식 코드를 작성하여 연속으로 두 자리 숫자를 찾으려면 어떻게해야할까요? (그리고 그럴 수는 있지만 더 긴 코드 일 것이고 읽기가 더 어려울 것입니다.)

정규식은 "\ d \ d"입니다. 이것을 정규식없이 작성하려면 많은 if 문이 필요합니다.

+1

\ d {2}은 (는) 잘 작동하며 더 읽기 쉬운 IMO입니다. – JDiPierro

+1

{n}을 세 개 이상 사용합니다. 개인의 취향. \ d \ d가 1 문자 짧기 때문에 나는 생각한다. –

+0

Thanx @ jeanne-boyarsky – Prabhakaran

4

당신이 준 예제는 믿을 수 없을만큼 기본입니다. 어쩌면 정규식은 그 상황에 대한 최상의 대답이 아닐 수도 있습니다. 정규식은 많은 용도로 사용됩니다. ETL 작업에서 정규 표현식을 많이 사용하여 정보를 식별하고 추출하려고합니다. 종종 나는 lookbehinds, 그룹 및 문자 세트를 캡처합니다. 고급 정규 표현식을 사용하면 프로그래밍 방식으로 일하는 것보다 훨씬 쉽습니다.

예를 들어 내 친구가 쉼표를 사용했는지 여부와 관계없이 문자열에서 유효한 금액을받은 정규 표현식이 필요한 경우를들 수 있습니다. 나는 그것에 대해 쓴 정규식은 다음과 같습니다

(< = \ $?) \ d를 {1,3} (\ D {3}?) * \ D {2} (\ D?!).

(?<=\$)은 긍정적 인 표정입니다. 이것은 $는 본선 경기 전에 있어야하지만 포함되지 않아야한다는 것입니다.

\d{1,3}은 1에서 3까지의 숫자를 찾고 있습니다.

,?은 쉼표와 일치하지만 선택 사항입니다.

\d{3}은 다시 3입니다.

*의 그룹에있는 모든 시퀀스가 ​​0 개 이상 일치하면.

\.\d{2}(?!\d) 우리는 센트가 있지만 겨우 2 자리 가치가 있음을 확인합니다. (?!\d)은 부정적인 미리보기이며 기본 일치 후에 다른 숫자가 올 수 없음을 의미합니다. 일치하는 항목이 있으면 일치가 무효화됩니다.

이 정규식은 프로그래밍 방식으로 작성하는 것이 상당히 어려우며 많은 시간이 걸릴 것입니다. regexes를 사용하면 시간을 절약 할 수 있습니다. 정규 표현식을 이해하면 한눈에 무슨 일이 벌어지고 있는지 쉽게 볼 수 있습니다.

이 정규식은 다음과 같은 것들과 일치 :

$ 1,000,000.00 및 $ 100000.00

하지만 같은과 일치하지 않을 :

$ 1,00,000.00 또는 쉼표가 다음에서 제거 할 수 있습니다 $ 1000.000

일치하는 값을 찾은 다음 숫자 데이터 유형으로 구문 분석 할 수 있습니다.

+0

Thanx @jdipierro – Prabhakaran