2017-03-14 1 views
-2

나는 정규 표현식을 가지고 그것은 수 댓글을 제외하는 정규식?</p> <pre><code>(/*([^*]|[rn]|(*+([^*/]|[rn])))**+/)|(//.*) </code></pre> <p>을 그리고 내 테스트 문자열은 다음과 같이 다음과 같이

https://regex101.com/r/lx2f5F/1

가 라인 2, 4 일치

<? 
/* This is a comment */ 

cout << "Hello World"; // prints Hello World 

/* 
* C++ comments can also 
*/ 

cout << "Hello World"; 

/* Comment out printing of Hello World: 

cout << "Hello World"; // prints Hello World 

*/ 

echo "//This line was not a Comment, but ... "; 
echo "http://stackoverflow.com"; 
echo 'http://stackoverflow.com/you can not match this line'; 
array = ['//', 'no, you can not match this line!!'] 
/* This is * //a comment */ 
~ 9 (7), (13) ~ 17 올바르게.

그러나 그것은 또한, 방법 비 욕심 매칭?

어떤 도움이 기꺼이 감상 할 수있다.

+0

정규식 * for * 란 무엇입니까? 그리고 왜*? – jonrsharpe

+0

명확하게 언급하고 싶은 라인이나 일치하지 않는 라인을 ... 우리가 정규식에서 이해해야한다면 당신의 정규식은 정확해야합니다. 따라서 짐작할 시간이 없습니다. –

+0

This 질문에 이미 답변이 있습니다. 여기를 볼 수 있습니다! http://stackoverflow.com/a/41867753/2012407 – antoni

답변

0

나는 당신에게 새로운 최상의 패턴을 가지고 있다고 믿습니다.

<? 
/* This is a comment */ 

cout << "Hello World"; // prints Hello World 

/* 
* C++ comments can also 
*/ 

cout << "Hello World"; 

/* Comment out printing of Hello World: 

cout << "Hello World"; // prints Hello World 

*/ 

echo "//This line was not a Comment, but ... "; 
echo "http://stackoverflow.com"; 
echo 'http://stackoverflow.com/you can not match this line'; 
array = ['//', 'no, you can not match this line!!'] 
/* This is * //a comment */ 

패턴 설명 :
/\/\*[\s\S]*?\*\/|(['"])[\s\S]+?\1(*SKIP)(*FAIL)|\/{2}.*/
이 정확하게 단계 단지 683 텍스트의 다음 블록을 처리합니다 (Demo을 빈 문자열로 주석 문자열을 대체하기 위해 하단에있는 대체 상자를 사용할 수 있습니다 * - 효과적으로 모든 주석을 제거)

/\/\*[\s\S]*?\*\/에 맞추기 \* 0 또는 다음 이상의 문자 */
,536합니다.|또는
(['"])[\s\S]*?\1(*SKIP)(*FAIL)가 일치하지 않습니다 ' 또는 " 다음 1 개 이상의 문자 다음 선도 (캡처) 문자
|또는
\/{2}.*/일치 // 다음 0 개 이상의 비 개행 문자

[\s\S]을 사용하는 것은 . 줄 바꿈 문자를 허용한다는 점을 제외하고 이것은 처음 두 가지 대안에서 의도적으로 사용됩니다. 세번째 대안은 개행 문자가 발견 될 때 의도적으로 .을 사용합니다.

가장 빠른 대안이 가장 먼저 나오고 패턴이 최적화되도록 모든 대안 순서를 확인했습니다. 내 패턴이 OP의 샘플 입력과 정확하게 일치합니다. 누구든지 내 패턴에 문제가있는 경우 수정 해 볼 수 있도록 의견을 남겨주세요.


월의 패턴은 올바르게 사용 1006 단계의 OP가 원하는 문자열을 모두 일치 : ~([\'\"])(?<!\\).*?\1(*SKIP)(*FAIL)|(?|(?P<comment>(?s)\/\*.*?\*\/(?-s))|(?P<comment>\/\/.+))~gx

사힐의 패턴이 완전히 업데이트] 샘플 입력의 마지막 코멘트에 맞게 실패합니다. 이것은 질문이 잘못되었거나 "당신이 무엇을 요구하고 있는지 분명하지 않다"는 의미이거나 Sahil의 대답이 잘못되어 녹색 눈금을 받아서는 안됩니다. 질문을 업데이트 할 때 Sahil이 대답을 업데이트하도록 요청 했어야합니다. 부정확 한 답이 질문을 만족시키지 못하면 미래의 SO 독자는 혼란스러워지고 SO는 덜 신뢰할만한 자원이됩니다.

0

와 마지막 줄에 작은 따옴표 ('), 큰 따옴표 (") 및 배열과 일치 a working demo on regex101.com를 참조

([\'\"])(?<!\\).*?\1(*SKIP)(*FAIL) 
| 
(?| 
    (?P<comment>(?s)/\*.*?\*/(?-s)) 
    | 
    (?P<comment>//.+) 
) 


참고 : PCRE 당신은 (*SKIP)(*FAIL) 메커니즘을 사용할 수 있습니다. 분기 리셋 (?|...)은 여기에 실제로 필요하지 않지만 단순히 comment이라는 그룹을 명확하게 만드는 데 사용되었습니다.

+0

감사합니다. – kkasp

관련 문제