2012-12-07 2 views
0

저는 4 개의 정규 표현식을 가지고 있습니다. 그리고 그것들은 훌륭하게 작동하지만 일부 응용 프로그램에서는 CPU를 pegging하고 있습니다. 나는 그들이 가장 잘 보이는 정규 표현식이라는 것을 알고 있지만, 나는 더 나은 방법을 확신하지 못한다. 정규 표현식을 최적화하기 위해 할 수있는 일이 있습니까?Regex는 CPU를 pegging하고 있습니다

itemtype="http://schema.org/" 
itemtype="http://data-vocabulary.org/" 

을하지만 공간의 양이 여전히 HTML에서 유효 할 것이기 때문에 :

public static Regex schemaOrg = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://schema.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled); 
public static Regex dataVocabulary = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://data-vocabulary.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled); 

는 기본적으로 찾고. 예를 들어

:

itemtype ="http://schema.org/" 
itemtype= "http://schema.org/" 
itemtype=" http://schema.org/ " 

는 모든 유효한 것입니다.

업데이트 : 여전히 CPU를 잘못 처리합니다.

\s+itemtype\s*=\s*(?:'|"")\s*http://schema\.org/ 
+0

끝에'('| "")'가 없습니다. – dasblinkenlight

+0

@ dasblinkenlight : 무엇이라도 있으면 닫는'\ 1'이어야합니다. –

+0

@TimPietzcker 당연히 그것 *해야 * (와 대답 * 그것은 *),하지만 OP는 후행 따옴표에 대해 잊어 버린 댓글 질문에'('| "")는 역 참조보다 이해하기 쉽습니다. – dasblinkenlight

답변

2

난 단지 생각할 수 지금까지 몇 가지.

  • 요구되지 \s* (schema.org/\s*vocabulary.org/\s*) 후단, 제거. 나는 당신도 후행 견적을 확인하지 않기 때문에 이것을 가정했다.
  • . (dot)\.schema.orgdata-vocabulary.org과 같이 특별한 의미를 갖습니다.
  • 첫 번째 \s*someitemtype과 일치하기 때문에 의미가 없습니다. 으로 바꾸거나 패턴 시작을 위해 단어 경계 \b을 사용해보십시오.
  • 만약 당신이 편집증 환자라면 으로 바꾸면 Regex가 그룹 ('|"")을 캡처하는 것을 막을 수 있습니다.

편집 : 또한 게으른 일치를 시도하고 도움이되는지 확인할 수 있습니다. 정규식이 CPU를 막히게되는 경우를 상상할 수 있습니다. 아래의 예제 정규식을 시도해보십시오

\s+?itemtype\s*?=\s*?(?:'|"")\s*?http://schema\.org/ 

을이이 문제의 맥락에서 코드 샘플 문자열을 게시하시기 바랍니다 도움이되지 않는 경우.

+0

+1 : 실제로'.'을 보시려면, – leppie

+0

당신이 말했습니다. '.' (점)은 복잡한 정규 표현식에서 개미와 같으며 URL 정규 표현식의 일부일 때 매우 쉽게 놓칠 수 있습니다. –

+0

이것은 여전히 ​​CPU가 몹시 걸려 있습니다. 나는 어떤 변화도 놓치지 않았다. OP에서. – Adam

0

가능한 개선은 다음과 같습니다

"을" "당신의 정규식이 필요하지 않습니다

다음 regex.match을하기 전에"모두 바꾸기 모든 \의