REGEX

2010-11-26 22 views
9

के साथ किसी चरित्र की पहली घटना के बारे में सभी खोजें, मैं एक .NET अनुप्रयोग बना रहा हूं और मुझे स्ट्रिंग से किसी भी गैर-दशमलव वर्ण को स्ट्रिप करने की आवश्यकता है (पहले '।' को छोड़कर)। अनिवार्य रूप से मैं वास्तविक संख्या परिणाम को मजबूर करने के लिए उपयोगकर्ता इनपुट की सफाई कर रहा हूं।REGEX

अब तक मैं एक ही पास में इसे प्राप्त करने और प्राप्त करने के लिए ऑनलाइन RegEx टूल का उपयोग कर रहा हूं, लेकिन मुझे बहुत दूर नहीं मिल रहा है।

मैं यह पूरा करना चाहते हैं:

asd123.asd123.123.123 = 123.123123123 

दुर्भाग्य से मैं केवल इस कोड का उपयोग करके मंच जहां

asd123.asd123.123.123 = 123.123.123.123 

को पाने के लिए प्रबंधित किया है।

System.Text.RegularExpressions.Regex.Replace(str, "[^\.|\d]*", "") 

लेकिन मैं पहले दशमलव बिंदु के अलावा सभी को हटाने की कोशिश कर रहा हूं।

क्या यह एक ही पास में किया जा सकता है?
क्या कोई बेहतर तरीका ™ है?

+0

's/[।]/\ X {DEADBEEF} /; एस/[^ \ घ \ x {DEADBEEF}।] // छ; एस/\ x {DEADBEEF}/./; ' – tchrist

उत्तर

6

यह एक एकल regex में किया जा सकता, कम से कम .NET में जो lookbehind assertions अंदर अनंत पुनरावृत्ति का समर्थन करता है:

resultString = Regex.Replace(subjectString, @"(?<!^[^.]*)\.|[^\d.]", ""); 

स्पष्टीकरण:

(?<!^[^.]*) # Either match (as long as there is at least one dot before it) 
\.   # a dot 
|   # or 
[^\d.]  # any characters except digits or dots. 

(?<!^[^.]*) का अर्थ है: जोर कि एक स्ट्रिंग से मिलान करना असंभव है जो इनपुट स्ट्रिंग की शुरुआत में शुरू होता है और इसमें पूरी तरह से शामिल होता है बिंदुओं के अलावा अन्य पात्र। यह शर्त पहले के बाद सभी बिंदुओं के लिए सच है।

+1

धन्यवाद, इस उदाहरण ने मुझे उन चीजों को सिखाया है जिन्हें मैं रेगेक्स के बारे में कभी नहीं जानता था। – Mike

+0

धन्यवाद, मैंने कुछ नया भी सीखा! मैं दावाों को देखने के लिए लिंक पढ़ने तक उदाहरण को समझने में सक्षम नहीं था!इससे मुझे भी मदद मिली! –

0

सबसे पहले, आप जिस रेगेक्स का उपयोग कर रहे हैं वह किसी भी को छोड़ देगा। अक्षर छेड़छाड़ की। आप केवल [^.\d]* की जगह की जरूरत है के बाद से .[]

इस के बाद में कोई विशेष अर्थ नहीं है, तो आप कुछ इस तरह की कोशिश कर सकते:

Replace(str, "([\d]+\.[\d]+)[^\d].*", "\1"); 

लेकिन आप केवल इस आवश्यकता होगी अगर वहाँ में एक . है सब पर नंबर।

उम्मीद है कि इससे मदद मिलती है।

+0

पहले भाग को ठीक करने के लिए धन्यवाद। Http://regexpal.com/ के मुताबिक आपका दूसरा रेगेक्स 123.123.123.123 से मेल खाता है, वांछित प्रभाव? मैंने पहले इस्तेमाल नहीं किया "\ 1"। – Mike

+0

हम्म, दूसरा रेगेक्स इसे सभी से मेल खाना चाहिए, फिर इसे पहले से ही 123.123 छोड़कर \ 1 (जो पहले उप-पैटर्न, '()' में भाग होना चाहिए) - जब तक .NET एक अलग रेगेक्स सिस्टम का उपयोग नहीं करता है अभ्यस्त! –

2

मुझे लगता है कि यह नियमित अभिव्यक्तियों के बिना बेहतर किया जाएगा।

string str = "asd123.asd123.123.123"; 
StringBuilder sb = new StringBuilder(); 
bool dotFound = false; 
foreach (var character in str) 
{ 
    if (Char.IsDigit(character)) 
     sb.Append(character); 
    else if (character == '.') 
     if (!dotFound) 
     { 
      dotFound = true; 
      sb.Append(character); 
     } 
} 
Console.WriteLine(sb.ToString()); 
+0

धन्यवाद-मैं इस जवाब की सराहना करता हूं। इस तरह के तर्क का प्रयास करने के लिए उसने मेरे दिमाग को भी पार नहीं किया था। काश मैं 2 उत्तरों स्वीकार कर सकता हूं। – Mike