2014-09-22 1 views
1

다음 코드를 발견하여 here 텍스트의 n 번째 값을 찾습니다. 줄 바꿈이있는 텍스트에서 n 번째 항목을 찾는이 기능이 작동하지 않는 이유는 무엇입니까?

코드입니다 :

public static int NthIndexOf(this string target, string value, int n) 
{ 
    Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}"); 

    if (m.Success) 
     return m.Groups[2].Captures[n - 1].Index; 
    else 
     return -1; 
} 

내가 어떤 웹 페이지에 (공간이 원래 문자열에 나타나지 않습니다) "</FORM>"의 두 번째 발생의 인덱스를 찾기 위해 노력하고, 실패 했음에도 불구하고 텍스트에 존재합니다. 또한 웹 페이지의 일부 접두사를 잘라내어 두 번째 항목이 첫 번째 항목이되고 첫 번째 항목으로 식을 찾는 데 성공했습니다.

이 코드에 대한 주석 중 하나에서 누군가 "이 대상 문자열에 줄 바꿈이 포함되어 있으면이 정규식이 작동하지 않습니다."라고 썼습니다.

내 두 가지 질문은 다음과 같습니다

  1. 하지 않는 이유는이 코드가 작동 대상 문자열 바꿈이 포함 된 경우?

  2. 어떻게이 코드를 수정할 수 있습니까? 줄 바꿈이 포함 된 문자열에도 사용할 수 있습니다 (줄 바꿈을 바꾸거나 제거하는 것이 나에게 좋은 해결책으로 간주되지 않습니다)?

같은 일을하는 다른 기술을 찾지 않습니다.

+0

입력 및 출력의 예를 들려 줄 수 있습니까? – gunr2171

+0

HTML에서 데이터를 읽으려는 경우 [regex] (http://stackoverflow.com/) 대신 [Html Agility Pack] (http://htmlagilitypack.codeplex.com/)을 사용하는 것이 좋습니다. 질문/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454) –

답변

1

정규식이 줄 끝까지 일치합니다.

Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}", RegexOptions.Singleline); 
+1

저는 Reg Ex에 여러 줄 문자를 항상 사용하고 제공 한 링크를 보면 두 가지 방법으로 나타납니다. 똑같은 것. 여러 줄 대신 한 줄을 제안하는 이유가 있습니까? –

+1

을 선택하십시오. MultiLine^및 $에서 각 행의 시작과 끝을 찾습니다. 그래서 당신은 그것을 당신에게 적합한 것에 맞추어야 할 것입니다. – Mzf

1

을 기본 정규 표현식 말까지 새 줄에 : 코드는 다음과 같이 보일 것이다, 그래서 당신이 원하는 것을 들어

당신은 Singleline mode를 사용해야합니다. 이 문제를 해결하려면 당신은 당신이 RegExOptions here에 대한 자세한 정보를 찾을 수 있습니다

Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}", RegexOptions.MultiLine); 

정규식 옵션을 지정해야합니다.

관련 문제