VB.NET

2009-08-26 14 views
11

में कोड की एक पंक्ति में स्ट्रिंग में एकाधिक वर्णों को बदलें VB.NET का उपयोग करके मैं कोड की एक पंक्ति में स्ट्रिंग में वर्णों की एक श्रृंखला को प्रतिस्थापित करने में सक्षम होना चाहता हूं।VB.NET

अर्थात, और की तरह कुछ:

Dim charsToReplace as string = "acegi" 
Dim stringToBeReplaced as string = "abcdefghijklmnop" 

charsToReplace.ToArray().ForEach(Function (c) stringTobeReplaced = stringTobeReplaced.Replace(c, "")) 

बहरहाल, यह काम नहीं करता।

Sub Main() 
    Dim toReplace As String = "acegikmoq" 

    Console.WriteLine(mainString) 
    Dim chars As List(Of Char) = toReplace.ToList() 
    chars.ForEach(AddressOf replaceVal) 

    Console.WriteLine(mainString) 
    Console.ReadLine() 
End Sub 

Dim mainString As String = "this is my string that has values in it that I am going to quickly replace all of..." 

Sub replaceVal(ByVal c As Char) 
    mainString = mainString.Replace(c, "") 
End Sub 

यह किया जा सकता है:

निम्नलिखित काम है, तथापि मैं नहीं चाहता कि स्ट्रिंग एक वर्ग स्तर चर करना चाहता है

?

+0

यह "इसे फिर से लिखने के बजाय सटीक प्रश्न पूछना चाहिए" का एक मामला है। विस्तृत करने के लिए, मेरे पास वास्तव में एक स्ट्रिंग है जो मूल रूप से शब्दों की एक श्रृंखला है, जो रिक्त स्थान से अलग होती है। मेरे पास शब्दों की एक श्रृंखला है जिसे मैं स्ट्रिंग से बाहर करना चाहता हूं, इसलिए मैंने सोचा कि प्रस्ताव संभव/उपयोगी होगा। जब इस तरह से (अलग) प्रश्न पूछा जाता है, Regex उपयुक्त नहीं है। इसलिए मूल रूप से: मंद शब्द() स्ट्रिंग = ("द", "ब्राउन", "आलसी") स्ट्रिंग = "त्वरित ब्राउन फॉक्स कूदता है" परिणाम = "त्वरित लोमड़ी कूदता है" मेरी आशा के लिए था शब्द। फॉरएच (फंक्शन (डब्ल्यू) वाक्य। बदलें (डब्ल्यू, "") – hitch

उत्तर

1

स्ट्रिंग क्लास में ऐसा करने के लिए एक प्रतिस्थापन विधि है। आप इसे इस तरह से उपयोग कर सकते हैं:

YourString = YourString.Replace("OldValue", "NewValue") 
+0

मैं पूरी तरह से स्पष्ट नहीं हो सकता था, लेकिन मैं स्ट्रिंग में प्रत्येक चरित्र के हर उदाहरण को प्रतिस्थापित करना चाहता हूं। यानी वर्ण = "ऐस" longString = "abcdeabcdeabcde" परिणाम = "bdbdbd" की जगह ऐसा करने में सक्षम नहीं है – hitch

+0

आप वास्तव में उपयोग एक बार से अधिक जगह ले सकता है एक ही बयान पर:।। myDate2 = Date.Now.ToString ("एस") बदलें (":", "-")। बदलें ("टी", "") –

24

तो मैंने पढ़ा है यह सही ढंग से, आप एक स्ट्रिंग से वर्णों की एक सूची पट्टी की कोशिश कर रहे। यह RegEx के लिए एक अच्छा फिट है। हालांकि -

Console.WriteLine(Regex.Replace("abcdefghijklmnop", "[acegi]", string.Empty)) 

, एक रेगुलर एक्सप्रेशन उचित तरीका है, और भविष्य डेवलपर्स इसके लिए :) धन्यवाद होगा

+0

उस विधि के प्रदर्शन के बारे में क्या, अगर अक्सर इस्तेमाल किया जाता है? – serhio

+0

@ सेरहियो: रेगेक्स वास्तव में स्ट्रिंग हेरफेर के लिए बनाया गया है। स्ट्रिंग को संभालने के लिए आप जो कुछ भी उपयोग करते हैं, रेगेक्स इसे बहुत तेज तरीके से करता है और कम संसाधनों का उपयोग करता है। –

+0

@ साइमन डुग्रे जैसा कि मेरे उत्तर में दिखाया गया है (जो आपकी टिप्पणी से पहले था) यह दूसरी तरफ है। रेगेक्स रास्ता बहुत धीमा है। – JDC

1

मैं जॉन गैलोवे के दृष्टिकोण की सलाह देते हैं (आप System.Text.RegularExpressions आयात करना होगा) लिंक के साथ हल करने में भी मुश्किल समस्या नहीं है। मुझे लगता है इस कोड को शायद थोड़ा बेहतर तो regex बराबर प्रदर्शन करेंगे

string stringToBeReplaced = "abcdefghijklmnop"; 
string charsToReplace = "acegi"; 
stringToBeReplaced = new String(stringToBeReplaced.Where(c => !charsToReplace.Any(rc => c == rc)).ToArray()); 

, अगर प्रदर्शन एक मुद्दा है: यहाँ कुछ (untested) सी # करने के लिए कोड है।

6

RegEx दृष्टिकोण सबसे उचित होगा, लेकिन क्या मैं वास्तव में कहने की जरूरत है:

कृपया, रखरखाव डेवलपर्स के प्यार के लिए, ऐसा नहीं इस कोड के 1 लाइन करने के लिए नीचे हो रही पर लटका दिया-उठो । एक विधि कॉल आपका वास्तविक लक्ष्य है, यदि आप केवल एक लाइन में कॉल के गुच्छा को दबाकर कहते हैं कि यह एक पंक्ति है तो आप पैर में खुद को शूटिंग कर रहे हैं।

+0

विकास उद्देश्यों के लिए इसे एक पंक्ति में लाने के लिए वास्तव में मेरा मुख्य लक्ष्य नहीं है, "मेरे बोनट में मधुमक्खी प्राप्त करने के लिए और अधिक क्योंकि यह काम नहीं करता है कि मैंने इसे कैसे सोचा था, और यह जानना चाहता हूं कि यह कैसे करना है" उद्देश्य। .. :) – hitch

+3

रखरखाव डेवलपर्स के लिए +1 - वहां गया, ऐसा किया गया, वह सिरदर्द था! =) – Rob

5

मुझे बिटरकोड पर विश्वास नहीं था क्योंकि उन्होंने कहा था कि LINQ रेगेक्स से बेहतर प्रदर्शन करेगा। तो मैंने सुनिश्चित करने के लिए बस थोड़ा परीक्षण किया।

तीन ऐसा करने के तरीके के उदाहरण:

Dim _invalidChars As Char() = New Char() {"j"c, "a"c, "n"c} 
Dim _textToStrip As String = "The quick brown fox jumps over the lazy dog" 

Private Sub btnStripInvalidCharsLINQ_Click(sender As System.Object, e As System.EventArgs) Handles btnStripInvalidCharsLINQ.Click 
    Dim stripped As String = String.Empty 
    Dim sw As Stopwatch = Stopwatch.StartNew 
    For i As Integer = 0 To 10000 
     stripped = _textToStrip.Where(Function(c As Char) Not _invalidChars.Contains(c)).ToArray 
    Next 
    sw.Stop() 

    lblStripInvalidCharsLINQ.Text = _stripped & " - in " & sw.Elapsed.TotalMilliseconds & " ms" 
End Sub 

Private Sub btnStripInvalidCharsFOR_Click(sender As System.Object, e As System.EventArgs) Handles btnStripInvalidCharsFOR.Click 
    Dim stripped As String = String.Empty 
    Dim sw As Stopwatch = Stopwatch.StartNew 
    stripped = _textToStrip 
    For i As Integer = 0 To 10000 
     For Each c As Char In _invalidChars 
      stripped = stripped.Replace(c, "") 
     Next 
    Next 
    sw.Stop() 

    lblStipInvalidcharsFor.Text = stripped & " - in " & sw.Elapsed.TotalMilliseconds & " ms" 
End Sub 

Private Sub btnStripInvalidCharsREGEX_Click(sender As System.Object, e As System.EventArgs) Handles btnStripInvalidCharsREGEX.Click 
    Dim stripped As String = String.Empty 
    Dim sw As Stopwatch = Stopwatch.StartNew 
    For i As Integer = 0 To 10000 
     stripped = Regex.Replace(_textToStrip, "[" & New String(_invalidChars) & "]", String.Empty) 
    Next 
    sw.Stop() 

    lblStripInvalidCharsRegex.Text = stripped & " - in " & sw.Elapsed.TotalMilliseconds & " ms" 
End Sub 

परिणाम:

Performance results

तो, string.replace साथ पाश के लिए सभी अन्य तरीकों outperformes।

इस वजह से मैं स्ट्रिंग ऑब्जेक्ट में एक्सटेंशन फ़ंक्शन कर दूंगा।

_textToStrip.ReplaceAll(_invalidChars, CChar(String.Empty)) 
0

क्या लाइन बयान दोहराने के लिए क्या तुम सच में लगता है कि कोड का उपयोग करना चाहते हैं तो सबसे अच्छा तरीका है:

Sub Main() 

    Dim myString As String = Nothing 
    Dim finalString As String = Nothing 
    Console.Write("Please enter a string: ") 'your free to put anything 
    myString = Console.ReadLine() 
    finalString = myString.Replace("0", "") 
    myString = finalString 
    finalString = myString.Replace("1", "") 
    myString = finalString 
    finalString = myString.Replace("2", "") 
    myString = finalString 
    finalString = myString.Replace("3", "") 
    myString = finalString 
    finalString = myString.Replace("4", "") 
    myString = finalString 
    finalString = myString.Replace("5", "") 
    myString = finalString 
    finalString = myString.Replace("6", "") 
    myString = finalString 
    finalString = myString.Replace("7", "") 
    myString = finalString 
    finalString = myString.Replace("8", "") 
    myString = finalString 
    finalString = myString.Replace("9", "") 
    Console.WriteLine(finalString) 
    Console.ReadLine() 
End Sub 

Module StringExtensions 
<Extension()> _ 
Public Function ReplaceAll(ByVal InputValue As String, ByVal chars As Char(), replaceWith As Char) As String 
    Dim ret As String = String.Empty 
    For Each c As Char In chars 
     ret.Replace(c, replaceWith) 
    Next 
    Return ret 
End Function 

तो फिर तुम एक पंक्ति में इस समारोह अच्छा और readably इस्तेमाल कर सकते हैं

उदाहरण के लिए: यदि आपने टाइप किया: 012ALP456HA90BET678 आउटपुट होगा: ALPHABET

+0

स्टैक ओवरफ्लो में आपका स्वागत है। कृपया मेरे प्रश्न में किए गए संपादन पर नज़र डालें ताकि आप भविष्य में प्रश्न पूछने के तरीके से बेहतर तरीके से जान सकें। – Brett

+0

सबसे अधिक प्रदर्शन करने वाला और न ही सबसे सुरुचिपूर्ण तरीका है – serhio

0
Public Function SuperReplace(ByRef field As String, ByVal ReplaceString As String) As String 
    ' Size this as big as you need... it is zero-based by default' 
    Dim ReplaceArray(4) As String 

    'Fill each element with the character you need to replace' 

    ReplaceArray(0) = "WARD NUMBER " 
    ReplaceArray(1) = "WN " 
    ReplaceArray(2) = "WARD NO " 
    ReplaceArray(3) = "WARD-" 
    ReplaceArray(4) = "WARD " 

    Dim i As Integer 
    For i = LBound(ReplaceArray) To UBound(ReplaceArray) 
    field = Replace(field, ReplaceArray(i), ReplaceString) 
    Next i 
    SuperReplace = field 
End Function