REGEX

2010-11-26 26 views
9

ile bir karakterin tümünün ilk oluşumunu bulun ama .Net uygulaması yapıyorum ve ondalık olmayan karakterleri bir dizeden ayırmalıyım (ilk '.' Hariç). Esasen gerçek sayı sonucunu zorlamak için kullanıcı girdisini temizliyorum.REGEX

Şimdiye kadar tek bir geçişte bunu denemek ve elde etmek için çevrimiçi RegEx araçlarını kullanıyorum, ama çok uzağa gitmiyorum.

Bunu başarmak isteyen:

asd123.asd123.123.123 = 123.123123123 

Ne yazık ki sadece bu kodu kullanarak sahnedeki

asd123.asd123.123.123 = 123.123.123.123 

almak başardınız.

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

Ancak, ilk ondalık noktanın tümünü kaldırmaya çalışıyorum.

Bu, tek bir geçişte yapılabilir mi?
Daha iyi bir yol var mı?

+0

's/[.]/\ X {DEADBEEF} /; s/[^ \ d \ x {DEADBEEF}.] // g; s/\ x {DEADBEEF} /./; ' – tchrist

cevap

6

Bu, en az bir .NET, tek düzenli ifade yapılabilir Assert Giriş dizgisinin başlangıcında başlayan ve yalnızca noktalar dışındaki karakterler. Bu koşul, ilkini izleyen tüm noktalar için geçerlidir.

+1

Teşekkürler, bu örnek bana regex hakkında hiçbir şey bilmediğim şeyleri öğretti. – Mike

+0

teşekkürler, ben de yeni bir şey öğrendim! Örneği, lookbehind iddialarına giden bağı okuyana kadar anlayamadım!Bu da bana yardımcı oldu! –

0

Öncelikle, şu anda kullandığınız normal ifade herhangi bir | el değmemiş karakterler.

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

Ama içinde hiç bir . varsa sadece bu gerekir: . Bundan sonra []

içinde özel bir anlamı vardır çünkü sadece böyle bir şey deneyebilirsiniz yerine [^.\d]* ihtiyaç numara.

Bu yardımcı olur umarım.

+0

İlk parçayı sabitlediğiniz için teşekkürler. Http://regexpal.com/ adresinize göre ikinci regex'in tümü 123.123.123.123 ile eşleşecek mi? Daha önce "\ 1" görmedim. – Mike

+0

Hmm, ikinci normal ifade, tümüyle eşleşmeli, sonra .NET'i, farklı bir normal sekans sistemi kullanmıyorsa, yalnızca 123.123'ü bırakarak, \ 1 ile (ilk alt şablon olmalı,() 'deki) ile değiştirin. alışığım! –

2

Normal ifadeler olmadan daha iyi bir şekilde yapılacağını düşünüyorum.

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

Açıklama:

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

(?<!^[^.]*) şu anlama gelir: lookbehind assertions içinde sonsuz tekrarı destekler

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

Teşekkür ederim Bu cevabı takdir ediyorum. Bu tarz bir mantığı denemek için aklımdan bile geçmemişti. Keşke 2 cevabı kabul edebilseydim. – Mike