2010-09-24 5 views
5

अद्यतनजावा के appendReplacement और appendTail

सी # Regex बराबर क्या है यहाँ मैं के साथ आया है। मैंने अभी तक इसका परीक्षण नहीं किया है क्योंकि यह कोड के एक बड़े टुकड़े का हिस्सा है जिसे अभी भी पोर्ट किया जाना चाहिए।

क्या आप कुछ भी देख सकते हैं जो जगह से बाहर दिखता है?

private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
string html = "some html"; 
int p = 0; 
var userBlock = new ArrayList(); 

MatchCollection matcher = preservePatterns[p].Matches(html); 
int index = 0; 
StringBuilder sb = new StringBuilder(); 
int lastValue = 0; 

foreach(Match match in matcher){ 
    string matchValue = match.Groups[0].Value; 

    if(matchValue.Trim().Length > 0) { 
     userBlock.Add(matchValue); 

     int curIndex = lastValue + match.Index; 
     sb.Append(html.Substring(lastValue, curIndex)); 
     sb.AppendFormat(tempUserBlock, p, index++); 

     lastValue = curIndex + match.Length; 
    } 
} 

sb.Append(html.Substring(lastValue)); 
html = sb.ToString(); 

मूल नीचे पोस्ट:

यहाँ मूल जावा है:

private static final String tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
String html = "some html"; 
int p = 0; 
List<String> userBlock = new ArrayList<String>(); 

Matcher matcher = patternToMatch.matcher(html); 
int index = 0; 
StringBuffer sb = new StringBuffer(); 
while (matcher.find()) 
{ 
    if (matcher.group(0).trim().length() > 0) 
    { 
     userBlock.add(matcher.group(0)); 
     matcher.appendReplacement(sb, MessageFormat.format(tempUserBlock, p, index++)); 
    } 
} 
matcher.appendTail(sb); 
html = sb.toString(); 

और मेरी सी # रूपांतरण अब तक

private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
string html = "some html"; 
int p = 0; 
var userBlock = new ArrayList(); 

MatchCollection matcher = preservePattern.Matches(html); 
int index = 0; 
StringBuilder sb = new StringBuilder(); 

for(var i = 0; i < matcher.Count; ++i){ 
    string match = matcher[i].Groups[0].Value; 
    if(match.Trim().Length > 0) { 
     userBlock.Add(match); 
     // WHAT DO I DO HERE? 
     sb.Append(string.Format(tempUserBlock, p, index++));    
    } 
} 
// WHAT DO I DO HERE? 
matcher.appendTail(sb); 
html = sb.toString(); 

ऊपर टिप्पणी देखें, जहां मैं पूछता हूं, "मैं यहां क्या करूँ?"

स्पष्टीकरण
जावा कोड ऊपर कुछ HTML पर स्ट्रिंग प्रतिस्थापन प्रदर्शन कर रहा है। यह मूल रूप से प्रतिस्थापित टेक्स्ट को सहेजता है क्योंकि कुछ व्हाइटस्पेस संपीड़न पूरा होने के बाद इसे फिर से डालने की आवश्यकता होती है।

+1

तो समस्या क्या है? – erickson

+2

क्या आप इस मुद्दे को बेहतर तरीके से परिभाषित कर सकते हैं, जैसे अपेक्षित परिणाम क्या है और आपको क्या परिणाम मिल रहा है? – CodingGorilla

+5

मैं अपने भागों का अनुमान लगा रहा हूं '// मैं क्या करूँ?' – jrummell

उत्तर

5

जावा के appendReplacement/appendTail कार्यक्षमता पुन: पेश करने की आवश्यकता नहीं है; .NET में कुछ बेहतर है: MatchEvaluator। इसे देखें:

string holder = "Element {0} = {1}"; 
string s0 = "111 222 XYZ"; 
ArrayList arr = new ArrayList(); 

string s1 = Regex.Replace(s0, @"\d+", 
    m => string.Format(holder, arr.Add(m.Value), m.Value) 
); 

Console.WriteLine(s1); 
foreach (string s in arr) 
{ 
    Console.WriteLine(s); 
} 

उत्पादन:

Element 0 = 111 Element 1 = 222 XYZ 
111 
222 

वहाँ MatchEvaluator, सभी को अच्छी तरह से this article में चर्चा को लागू करने के कई तरीके हैं। यह एक (लैम्ब्डा अभिव्यक्ति) अब तक का सबसे अच्छा है।

+1

मैं इसे सुबह में देख लूंगा। "शीतलता" के आधार पर प्रोग्रामिंग के लिए +1। –

+1

उत्कृष्ट। यह बहुत अच्छा काम किया। धन्यवाद। –

2

मैं जावा regex कक्षाओं से परिचित नहीं हूँ, लेकिन यह मैं अपने कोड क्या करता है लगता है की मेरी सी # व्याख्या है:

private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
string html = "some html"; 
int p = 0; 
var userBlock = new List<string>(); 

MatchCollection matcher = preservePattern.Matches(html); 
StringBuilder sb = new StringBuilder(); 
int last = 0; 
foreach (Match m in matcher) 
{ 
    string match = m.Groups[0].Value; 
    if(match.Trim().Length > 0) { 
     userBlock.Add(match); 
     sb.Append(html.Substring(last, m.Index - last)); 
     sb.Append(m.Result(string.Format(tempUserBlock, p, index++))); 
    } 
    last = m.Index + m.Length; 
} 
sb.Append(html.Substring(last)); 
html = sb.ToString(); 
+1

कमाल, यह लगभग बिल्कुल ठीक है जो मैं आया था! आपने एम.इंडेक्स + एम। लम्बाई को सही जगह पर रखा है। धन्यवाद। मैं आपको बता दूंगा कि यह थोड़ा सा प्रदर्शन कैसे करता है। –

+1

पूरी तरह से काम करता है। धन्यवाद! –

संबंधित मुद्दे