सभी को हटाने के लिए रेगेक्स (गैर संख्यात्मक या अवधि)


93

मुझे "joe ($ 3,004.50)" जैसे पाठ की आवश्यकता है जिसे 3004.50 तक फ़िल्टर किया जा सकता है, लेकिन रेगेक्स में भयानक है और एक उपयुक्त समाधान नहीं मिल सकता है। इसलिए केवल संख्याएँ और अवधियाँ रहनी चाहिए - बाकी सब कुछ फ़िल्टर्ड मैं C # और VS.net 2008 फ्रेमवर्क 3.5 का उपयोग करता हूं

जवाबों:


166

यह करना चाहिए:

string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");

1
किस बारे में joe.smith ($3,004.50)? बस अपमानजनक चरित्र वर्गों को हटाने से काफी गलत हो सकता है।
मैथ्यू गन

2
मैं एक छोटा सुधार करता हूं: Regex.Replace(s, "[^$0-9.]", "");आप डॉलर का चिह्न छोड़ना चाहते हैं।
बोडैसिडो

35

रेगेक्स है:

[^0-9.]

आप regex को कैश कर सकते हैं:

Regex not_num_period = new Regex("[^0-9.]")

फिर उपयोग करें:

string result = not_num_period.Replace("joe ($3,004.50)", "");

हालांकि, आपको यह ध्यान रखना चाहिए कि कुछ संस्कृतियों में मौद्रिक मात्रा लिखने के लिए अलग-अलग परंपराएं हैं, जैसे: 3.004,50।


सत्यापित करने के लिए बहुत आलसी एटीएम, लेकिन आपको भागने की जरूरत नहीं है। ?
एंड्रयू एंडरसन

7
@ पता: नहीं, एक चरित्र वर्ग के अंदर, .कोई विशेष अर्थ नहीं है।
बार्ट कीर्स

2

स्वीकृत उत्तर के लिए, मैथ्यूगुन एक वैध बिंदु उठाता है कि पूरे स्ट्रिंग में सभी अंक, अल्पविराम और अवधियों को एक साथ संघनित किया जाएगा। इससे बचेंगे:

string s = "joe.smith ($3,004.50)";
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)");
Match m = r.match(s);
string v = null;
if (m.Success) {
  v = m.Groups[1].Value;
  v = Regex.Replace(v, ",", "");
}

रेगेक्स के ऊपर लगता है अतिरिक्त कोष्ठक है। का उपयोग करते हुए (?:^|[^w.,])(\d[\d,.]+)(?=\W|$)भी "H25" से मेल खाएगी स्ट्रिंग में "joe.smith25 ($ 3,004.50)"
Rivka

1

आक्रामक चरित्रों को हटाने का दृष्टिकोण संभावित रूप से समस्याग्रस्त है। क्या होगा अगर .स्ट्रिंग में कहीं और है? इसे हटाया नहीं जाएगा, हालांकि यह होना चाहिए!

गैर-अंकों या अवधियों को हटाने से, स्ट्रिंग joe.smith ($3,004.50)अप्राप्य में बदल जाएगी .3004.50

इम्हो, एक विशिष्ट पैटर्न से मेल खाना बेहतर है, और एक समूह का उपयोग करके इसे निकालना है। कुछ सरल सभी प्रासंगिक अल्पविराम, अंक, और regexp के साथ अवधियों को खोजना होगा:

[\d,\.]+

नमूना परीक्षण रन:

Pattern understood as:
[\d,\.]+
Enter string to check if matches pattern
>  a2.3 fjdfadfj34  34j3424  2,300 adsfa    
Group 0 match: "2.3"
Group 0 match: "34"
Group 0 match: "34"
Group 0 match: "3424"
Group 0 match: "2,300"

फिर प्रत्येक मैच के लिए, सभी कॉमा को हटा दें और उस पार्सर को भेजें। जैसे कुछ के मामले को संभालने के लिए 12.323.344, आप यह देखने के लिए एक और जांच कर सकते हैं कि एक मिलान सबस्ट्रिंग में सबसे अधिक है .


यह रेगेक्स हर चीज से मेल खाता है।
मन की बात

यह अब सब कुछ छोड़कर मेल खाता है ""
मन की बात

1
आपके द्वारा प्रस्तावित की जा रही अवधारणा के लिए एक जटिल rexx की आवश्यकता होती है जिसे पढ़ना और डीबग करना मुश्किल है। यह बेहतर हो सकता है कि इसे कई रेगेक्स और सशर्त के साथ चरणों में तोड़ दिया जाए। मैं एक उत्तर प्रदान कर सकता था (हालांकि रूबी में लिखा था क्योंकि मुझे c # नहीं पता है।
मन की बात

@mindriot प्वाइंट लिया। मैंने इसे कुछ अधिक पारदर्शी में बदल दिया।
मैथ्यू गन

पार्सर को भेजकर, आप Single.Parse()या तो मतलब है या Single.TryParse?
मन की बात

1

आप एक स्ट्रिंग के साथ काम कर रहे हैं - स्ट्रिंग एक है IEumerable<char>, इसलिए आप LINQ का उपयोग कर सकते हैं:

var input = "joe ($3,004.50)";
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.'));

Console.WriteLine(result);   // 3004.50
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.