2011-02-18 6 views
2

Hola. 난 일반 텍스트 또는 HTML 문서 내에서 단어를 테스트하는 메서드를 작성하는 데 실패했습니다. 나는 합리적으로 정규 표현식을 배웠고, C# (더 많은 자바에서부터)에 더 익숙하다. 그냥 '원인Regex vs String.Contains

, 다음

string html = source.ToLower(); 
string plaintext = Regex.Replace(html, @"<(.|\n)*?>", " "); // remove tags 
plaintext = Regex.Replace(plaintext, @"\s+", " "); // remove excess white space 

하고, 경우 "C++"를

string tag = "c++"; 
bool foundAsRegex = Regex.IsMatch(plaintext,@"\b" + Regex.Escape(tag) + @"\b"); 
bool foundAsContains = plaintext.Contains(tag); 

때때로 foundAsRegex가 사실이며 때로는 거짓 발견해야한다. 나의 google-fu는 약하다. 그래서 나는 "도대체"에 관해 많은 것을 다시 얻지 못했다. 모든 아이디어 또는 포인터 환영합니다!

편집 :

내가 이력서에 기술을 일치 찾고 있어요. 예를 들어, 고유 값 "C++".

편집 :

진짜 발췌 아래와 같습니다 :

"... 관리 - C, C++, 펄, 쉘 프로그래밍 ..."

귀하의 정규 표현식으로 돌고
+0

@CanSpice, 나는 포맷팅을 위해 편집하려고했는데 ... 당신이 나를 때렸다. .net 태그도 추가했습니다. – IAbstract

+0

어쩌면 HTML 문서를 파싱하기위한 Html 민첩성 팩을 살펴보십시오. http://htmlagilitypack.codeplex.com/ –

+0

여러분, 아이들이 여기에서 멋진 모습을 보입니다. 때로는 사용자가 나에게 나쁜 html과 평범한 텍스트를주기 때문에 html 태그가 2 차적입니다. – underachiever

답변

4

문제는 \b이 단어 문자와 단어가 아닌 문자 사이에 일치한다는 것입니다. 표현 \bc\+\+\b이 주어지면 문제가 발생합니다. "+"는 단어가없는 문자입니다. 따라서 "xxx C++, xxx"에서 패턴을 검색하면 아무것도 찾을 수 없습니다. "+"문자 뒤에 "단어 분리"가 없습니다.

단어가 아닌 문자를 찾고 있다면 논리를 변경해야합니다. 가장 좋은 것이 무엇인지 확실하지 않습니다. 나는 당신이 \W을 사용할 수 있다고 가정하지만, 라인의 처음이나 끝에서 일치하지 않을 것이므로 (^|\W)(\W|$) ...이 추한 것입니다. 그리고 천천히, 아마도 당신의 필요에 따라 충분히 빠르지 만.

+0

아! 나는 그것이 "C#"에 대한 비슷한 반응으로 진행되고 있다고 생각했습니다. 그러나 나는 또한 영숫자 단어에 대해서만 일치하지 않는 성냥이 있다고 생각한다. 나는 지금 그것을 확인하고있다. 그게 아니라면, 나는이 질문을 분명히 닫을 것이다. – underachiever

+0

확인. 그게 다야. 그것은 나쁜 정규 표현식이고, 그 이상은 아닙니다. 음, 나쁜 사용자 텍스트가 있지만 정규 표현식은 나쁜 사용자에 대해서는 아무 것도 할 수 없습니다. 도움과 관점에 감사드립니다! – underachiever

1

: 다른 단어 경계 다음에 문자열 c++ 다음 단어 경계, 찾고있는 의미

/\bc\+\+\b/ 

. 즉, abc++과 같은 문자열에서는 일치하지 않지만 plaintext.Contains은 성공합니다.

정규식이 성공할 것으로 예상되면 어디에서 정규식이 실패하는지 예제를 제공 할 수 있다면 더 확실한 답을 줄 수 있습니다.

편집 : 내 원래 정규식 c+++ 같은 정규 표현식 메타 문자를 탈출 Regex.Escape()에 전달되는 같이 잘못된 인 /\bc++\b/했다. 나는 그것을 위에 고쳤다.

+0

'Regex.Escape'가'\ bc \ + \ + \ b'으로 바꾸지 않습니까? –

+0

@ 대니얼 : 내 대답을 편집하면서 그 주석을 남겼습니다. :-) – CanSpice

+0

@canspice. 그게 내가 원하는거야.하지만 기대했던대로 작동하지 않아."C++"이 중간 스트림 인 경우 - 예 : "자바, 나쁜 문법, 나쁜 구두점, C++, 다른 어떤 후 - 하"- 찾을 수 있습니다. 그게 내 브레이크 포인트가 보여주는 것입니다. 그렇습니다. – underachiever