2011-10-05 2 views
1

달러 기호 사이의 모든 텍스트를 바꾸려면 C# .NET을 사용하고 싶습니다. 예를 들어 :달러 기호 사이의 텍스트를 바꾸는 RegEx

Check out this TeX: $x\in\mathbb{Z}^+$. It's cool. 

... 수식이 구글 차트 API에 전달되기 전에 URL 인코딩 할 필요가

Check out this TeX: <img src="http://chart.googleapis.com/chart?cht=tx&chl=x\in\mathbb{Z}^%2B" alt="x\in\mathbb{Z}^+" />. It's cool. 

하는 것으로 ...이된다.

RegEx (또는 다른 방법)를 사용하여이 작업을 수행하는 방법을 보여 주시겠습니까?

답변

2

당신 아마 Regex.Replace의 오버로드를 사용하려면, 그 교체를 계산하는 위임을 받아 들인다 :

private string GetCodeForTex(Match match) 
{ 
    string tex = match.Groups[1].Value; 
    return string.Format(
     "<img src=\"{0}\" alt=\"{1}\" />", GetEscapedUrlForTex(tex), tex); 
} 

… 

Regex.Replace(textWithDollars, @"\$([^\$]*)\$", GetCodeForTex); 

GetCodeForTex 미그에 대한 여러분의 코드 ht가 다르면 (그리고 더 나은 이름을 생각할 수도 있지만) 생각을하게 될 것입니다.

또한 정규 표현식을 사용하여 간단한 구문 분석에주의하십시오.즉, $을 TeX를 둘러싸 기위한 용도로만 사용할 수는 없습니다. $이 입력 텍스트의 어딘가에 있지 않은 경우 그 결과는 엉망이됩니다.

+0

감사. $ tex $ 대신에 어떤 형식을 사용 하시겠습니까? – James

+0

간단한 대답은 없습니다. 특히 TeX 코드 내에서'$'(또는 다른 간단한 구분자를 사용)를 사용하고자 할 수도 있습니다. 진정으로 강력한 솔루션은 형식에 맞는 실제 파서를 구현하는 것입니다. 또는 HTML 환경에있는 것처럼 보이기 때문에 기존의 HTML 파서를 사용하고 ' 텍스트 코드'과 같은 것을 사용할 수 있습니다. – svick

4

다음은 사용자에게 유용한 방법의 예입니다.

  • \$ - 일치하는 다음 Regex.Matches 방법을 사용하여,이 방법은 한 번에 여러 경기를 처리 할 수 ​​있습니다 :

    public static string AddImgTags(string input) 
    { 
        string pattern = @"\$([^\$]*)\$"; 
    
        foreach (Match match in Regex.Matches(input, pattern)) 
        { 
         input = input.Replace(match.Value, 
         string.Format("<img src=\"http://chart.googleapis.com/chart?cht=tx&chl={0}\" alt=\"{0}\" />", 
         HttpUtility.UrlEncode(match.Value))); 
        } 
    
        return input; 
    } 
    

    패턴에 대한 설명을 ("\$[^\$]*\$")는 다음과 같다 시작 $

  • ([^\$]*) - 0 회 이상 반복되는 $을 제외한 모든 문자와 일치합니다. 나중에 참조 할 수 있도록 일치하는 문자를 그룹화합니다.
  • \$ - 끝 $
+0

감사합니다. 대체품은 어떻게 생겨야합니까? 어려움은 이미지 URL에 전달되기 전에 달러 기호 사이의 텍스트를 URL로 인코딩해야한다는 것입니다. – James

+0

대체품에 캡처 된 텍스트의 * 수정 된 버전이 포함되어 있어야하는 경우이 방법을 사용할 수 없다고 생각합니다. – svick

+0

@svick 감사합니다. 그 변화를 위해 노력하고있었습니다. – Donut

1

일반적인 정규식

var s = Regex.Replace("test $blabla$! It worked", @"\$.*?\$", "123"); 

s 간단한 교체 할 것 "test 123! It worked"

0

다른 답변이 될 것이다 것입니다 일치하지만, 그들은 잡아하지 않습니다 그룹을 작성한 다음 교체품에 넣으십시오.

그래서,

\$([^\$]*)\$

다른 변화는 당신이 $ 내부의 텍스트를 잡을 수 있도록 Regex.Match를 호출하는 것입니다 캡처 그룹에 추가하는 작은 변화, @ 도넛의 등록 전 시작 Match. 캡쳐를 사용하십시오. 그런 다음 URL 인코딩을 실행하여 대체 텍스트를 작성할 수 있습니다.

뭔가 같은 :

var urlTemplate = "<img src="http://chart.googleapis.com/chart?cht=tx&chl={0}" alt="{1}" />"; 
var matchText = match.Captures[0].Value; 

var url = string.Format(urlTemplate, UrlEncode(matchText), matchText); 

당신은 텍스트가 지금 무엇을, 당신이 정상이 예를 들어 교체 한 다음 루프는 일치의 나머지 부분을 찾기 위해 다만 수 정확히 알고 있기 때문에

+0

바꾸어야 할 부분 문자열이 두 개 이상이면 어떻게 될까요? – svick

+0

또한 정규식이 잘못되었습니다. '[]'문자 그룹 밖에서'* '를 원한다. – svick

+0

정규식에있는 Opps - 내가 대신 URL 인코딩을 주소 지정하지 않았기 때문에 @Donut에서 가져온 것이라고 말했기 때문에. 대표자를 데려와 주셔서 감사합니다, 나는 그것을 인식하지 못했습니다. – davisoa

관련 문제