c# - examples - regular expression شرح




البحث واستخراج رقم من سلسلة (18)

Regex.Split يمكن استخراج الأرقام من السلاسل. تحصل على جميع الأرقام الموجودة في سلسلة.

string input = "There are 4 numbers in this string: 40, 30, and 10.";
// Split on one or more non-digit characters.
string[] numbers = Regex.Split(input, @"\D+");
foreach (string value in numbers)
{
    if (!string.IsNullOrEmpty(value))
    {
    int i = int.Parse(value);
    Console.WriteLine("Number: {0}", i);
    }
}

انتاج:

العدد: 4 العدد: 40 العدد: 30 الرقم: 10

لدي متطلبات للبحث عن رقم موجود داخل سلسلة واستخراجه.

على سبيل المثال ، من هذه السلاسل:

string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"

كيف يمكنني أن أفعل هذا؟


إليك إصدار Linq :

string s = "123iuow45ss";
var getNumbers = (from t in s
                  where char.IsDigit(t)
                  select t).ToArray();
Console.WriteLine(new string(getNumbers));

استخدام التعبير العادي ...

Regex re = new Regex(@"\d+");
Match m = re.Match("test 66");

if (m.Success)
{
    Console.WriteLine(string.Format("RegEx found " + m.Value + " at position " + m.Index.ToString()));
}
else
{
    Console.WriteLine("You didn't enter a string containing a number!");
}

انتقل من خلال السلسلة واستخدام Char.IsDigit

string a = "str123";
string b = string.Empty;
int val;

for (int i=0; i< a.Length; i++)
{
    if (Char.IsDigit(a[i]))
        b += a[i];
}

if (b.Length>0)
    val = int.Parse(b);

حل بسيط آخر باستخدام Regex يجب عليك استخدام هذا

using System.Text.RegularExpressions;

والرمز هو

string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"\d", "");
string mynumber = Regex.Replace(var, @"\D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);

سيتعين عليك استخدام Regex كـ \d+

\d تطابق الأرقام في السلسلة المعطاة.


لأولئك الذين يريدون الرقم العشري من سلسلة مع Regex بخطين :

decimal result = 0;
decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);

نفس الشيء ينطبق على تعويم ، طويل ، الخ ...


لا ينص السؤال صراحةً على أنك تريد فقط الأحرف من 0 إلى 9 ، لكن ذلك لن يكون امتدادًا للاعتقاد بأن هذا صحيح من مجموعة الأمثلة والتعليقات. إذن هنا هو الرمز الذي يفعل ذلك.

        string digitsOnly = String.Empty;
        foreach (char c in s)
        {
            // Do not use IsDigit as it will include more than the characters 0 through to 9
            if (c >= '0' && c <= '9') digitsOnly += c;
        }

لماذا لا تريد استخدام Char.IsDigit () - تحتوي الأرقام على أحرف مثل الكسور والمقتطفات والمرتفعات والرموز الرومانية وأعداد العملات والأرقام المطلية والأرقام الخاصة بالبرمجة النصية.


ما عليك سوى استخدام RegEx لمطابقة السلسلة ، ثم تحويل:

Match match = Regex.Match(test , @"(\d+)");
if (match.Success) {
   return int.Parse(match.Groups[1].Value);
}


هنا هو نهج Linq آخر الذي استخراج الرقم الأول من سلسلة.

string input = "123 foo 456";
int result = 0;
bool success = int.TryParse(new string(input
                     .SkipWhile(x => !char.IsDigit(x))
                     .TakeWhile(x => char.IsDigit(x))
                     .ToArray()), out result);

أمثلة:

string input = "123 foo 456"; // 123
string input = "foo 456";     // 456
string input = "123 foo";     // 123

يتم تقديم نهج مثير للاهتمام here بواسطة أحمد ماجد ، ويستخدم Regex و stringbuilder لاستخراج الأعداد الصحيحة بالترتيب الذي تظهر به في السلسلة.

مثال على ذلك باستخدام Regex.Split استناداً إلى المنشور بواسطة أحمد Mageed كالتالي:

var dateText = "MARCH-14-Tue";
string splitPattern = @"[^\d]";
string[] result = Regex.Split(dateText, splitPattern);
var finalresult = string.Join("", result.Where(e => !String.IsNullOrEmpty(e)));
int DayDateInt = 0;

int.TryParse(finalresult, out DayDateInt);

يمكنك القيام بذلك باستخدام خاصية String مثل أدناه:

 return new String(input.Where(Char.IsDigit).ToArray()); 

الذي يعطي فقط العدد من السلسلة.


\d+ هو regex لرقم صحيح. وبالتالي

//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"\d+").Value;

إرجاع سلسلة تحتوي على التواجد الأول لرقم في subjectString .

Int32.Parse(resultString) سوف يعطيك الرقم.


 string input = "Hello 20, I am 30 and he is 40";
 var numbers = Regex.Matches(input, @"\d+").OfType<Match>().Select(m => int.Parse(m.Value)).ToArray();

static string GetdigitFromString(string str)
    {
        char[] refArray = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] inputArray = str.ToCharArray();
        string ext = string.Empty;
        foreach (char item in inputArray)
        {
            if (refArray.Contains(item))
            {
                ext += item.ToString();
            }
        }
        return ext;
    }

var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
    int val;
    if(int.TryParse(match.Value,out val))
    {
        //val is set
    }
}

var outputString = String.Join("", inputString.Where(Char.IsDigit));

الحصول على جميع الأرقام في السلسلة. لذلك إذا كنت تستخدم للفحص "1 زائد 2" ، فسوف تحصل على "12".





string