English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي C#

دليل متقدم C#

C# منظم بالأ象

التعبيرات النمطية في C# (Regular expressions)

تعبيرات النمط هو نمط للتنسق مع النص المدخل.

يقدم محرك تعبيرات النمط الذي يسمح بهذا التطابق في إطار عمل .Net.

النمط مكون من حرف واحد أو أكثر، عمليات حسابية ومباني.

تحديد تعبيرات النمط

فيما يلي قائمة بالحروف والعمليات الحسابية والمباني المستخدمة لتحديد تعبيرات النمط المختلفة.

  • إسقاط الحروف

  • 字符类

  • النقاط المحددة

  • بناء المجموعات

  • محدد

  • بنية الاستدلال

  • البنية البديلة

  • التبديل

  • بناءات الم杂物

إسقاط الحروف

في تعبيرات النمط، الرمز المائل (\) يشير إلى أن الحرف التالي هو رمز خاص أو يجب تفسير هذا الحرف حرفياً.

في الجدول أدناه تم تقديم رموز الإسقاط:

رمز الإسقاطالوصفالنمطالتنسيق
\aتطابق مع رمز الجرس \u0007.\a"Warning!" + '\u0007' 中的 "\u0007"
\bفي فئة الحروف، تطابق مع مفتاح السحب \u0008.[\b]{3,}"\b\b\b\b" 中的 "\b\b\b\b"
\tتطابق مع رمز التبويب \u0009.(\w+)\t"Name\tAddr\t" 中的 "Name\t" و "Addr\t"
\rتطابق مع رمز السحب \u000D. (\r ليس معادلاً لـ \n.)\r\n(\w+)"\r\nHello\nWorld." 中的 "\r\nHello"
\vتطابق مع رمز الخط العمودي للنص \u000B.[\v]{2,}"\v\v\v" 中的 "\v\v\v"
\fتطابق مع رمز النسخة الجديدة للصفحة \u000C.[\f]{2,}"\f\f\f" 中的 "\f\f\f"
\nتطابق مع رمز النسخة الجديدة للصفحة \u000A.\r\n(\w+)"\r\nHello\nWorld." 中的 "\r\nHello"
\eتطابق مع رمز الإسقاط \u001B.\e"\x001B" 中的 "\x001B"
\ nnnيُحدد حرف باستخدام شكل العشرية (nnn مكون من ثنيات إلى ثلاثة أرقام).\w\040\w"a bc d" 中的 "a b" 和 "c d"
\x nn使用十六进制表示形式指定字符(nn 恰好由两位数字组成)。\w\x20\w"a bc d" 中的 "a b" 和 "c d"
\c X \c x匹配 X 或 x 指定的 ASCII 控件字符,其中 X 或 x 是控件字符的字母。\cC"\x0003" 中的 "\x0003" (Ctrl-C)
\u nnnn使用十六进制表示形式匹配一个 Unicode 字符(由 nnnn 表示的四位数)。\w\u0020\w"a bc d" 中的 "a b" 和 "c d"
\在后面带有不识别的转义字符时,与该字符匹配。\d+[\+-x\*]\d+\d+[\+-x\*\d+"(2+2) * 3*9" 中的 "2+2" 和 "3*9"

字符类

字符类与一组字符中的任何一个字符匹配。

下表列出了字符类:

字符类الوصفالنمطالتنسيق
[character_group]匹配 character_group 中的任何单个字符。 默认情况下,匹配区分大小写。[mn]"mat" 中的 "m","moon" 中的 "m" 和 "n"
[^character_group]非:与不在 character_group 中的任何单个字符匹配。 默认情况下,character_group 中的字符区分大小写。[^aei]"avail" 中的 "v" 和 "l"
[ first - last ]字符范围:与从 first 到 last 的范围中的任何单个字符匹配。[b-d][b-d]irds 可以匹配 Birds、 Cirds、 Dirds
.通配符:与除 \n 之外的任何单个字符匹配。
若要匹配原意句点字符(. 或 \u002E),您必须在该字符前面加上转义符 (\.)。
a.e"have" ٢٩ ١٧٥ ٩٢ ٧٥ ٩٢ ٬٩ ٩٢ ٧٥ ٩٢
\p{ name }٥٤٢٧ الاسم ٥٤٢٧ ٩١٤٢٬٨٠ ٩٢٬٨٠ ٩١٤٢٬٨٠ ٢٬٨٠ ٩١٤٢٬٨٠\p{Lu}"City Lights" ٢٩ ٩٢ ٬٩
\P{ name }٥٤٢٧ ٩١٤٢٬٨٠ الاسم ٥٤٢٧ ٩١٤٢٬٨٠ ٩٢٬٨٠ ٩١٤٢٬٨٠ ٢٬٨٠ ٩١٤٢٬٨٠\P{Lu}"City" ٢٩٢٥ ٩٢ ٩٢
\w٥٤٢٧ ٥٢٧٩٢٬٨٠ ٩١٧٥٢٬٨٠\w"Room#1" ٢١٢٣ ١٤٢٥
\Wتطابق أي حرف غير كلمة.\Wفي "Room#1" "#"
\sتطابق أي فراغ.\w\sفي "ID A1.3" "D "
\Sتطابق أي حرف غير فراغ.\s\Sفي "int __ctr" " _"
\dتطابق أي رقم دسم.\dفي "4 = IV" "4"
\Dتطابق أي حرف غير دسم.\Dفي "4 = IV" " " و "=" و " " و "I" و "V"

النقاط المحددة

النقاط المحددة أو التأكيدات الصفرية الزاوية تجعل التطابق ناجحًا أو فاشلًا، اعتمادًا على الموضع الحالي في النص، لكنها لا تجعل المحرك يتحرك في النص أو يستخدم الحروف.

الجدول أدناه يعرض النقاط المحددة:

التأكيدالوصفالنمطالتنسيق
^تطابق يجب أن يبدأ من بداية النص أو بداية السطر.^\d{3}في "567-777-" "567"
$تطابق يجب أن يظهر في نهاية النص أو يظهر في نهاية السطر أو في نهاية النص. \n من قبل.-\d{4}$في "8-12-2012" "-2012"
\Aتطابق يجب أن يظهر في بداية النص.\A\w{4}في "Code-007-" "Code"
\Zتطابق يجب أن يظهر في نهاية النص أو يظهر في نهاية النص أو في النهاية. \n من قبل.-\d{3}\Zفي "Bond-901-007" "-007"
\zتطابق يجب أن يظهر في نهاية النص.-\d{3}\zفي "-901-333" "-333"
\Gتطابق يجب أن يظهر في النقطة التي انتهت منها النسخة المكتشفة السابقة.\G\(\d\)في "(1)(3)(5)[7](9)" "(1)" و "(3)" و "(5)"
\bتطابق الحد الحرفي، وهو الموضع بين الكلمة والفضاء.er\bتطابق "never" في "er"، لكن لا تطابق "verb" في "er".
\Bتطابق غير الحد الحرفي.er\Bتطابق "verb" في "er"، لكن لا تطابق "never" في "er".

بناء المجموعات

بناء المجموعات يصف النسخة الفرعية من التعبيرات العادية، وتستخدم عادةً لتسجيل النسخة الفرعية من النص المدخل.

الجدول أدناه يعرض بناء المجموعات:

بناء المجموعاتالوصفالنمطالتنسيق
( subexpression )تسجيل النسخة المكتشفة في ترتيب من الصفر.(\w)\1في "deep" "ee"
(?< name >subexpression)تسجيل النسخة المكتشفة في مجموعة بتسمية.(?< double>\w)\k< double>في "deep" "ee"
(?< name1 -name2 >subexpression)تحديد مجموعة متوازنة.(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$في "3+2^((1-3)*(3-1))"، "((1-3)*(3-1))"
(?: subexpression)تحديد مجموعة غير محتسبة.Write(?:Line)?في "Console.WriteLine()"، "WriteLine"
(?imnsx-imnsx:subexpression)التطبيق أو إلغاء التطبيق subexpression المحدد المحدد.A\d{2}(?i:\w+)\bفي "A12xl A12XL a12xl"، "A12xl" و "A12XL"
(?= subexpression)التنبؤ المسبق غير العضوي للنطاق الصفر.\w+(?=\.)في "He is. The dog ran. The sun is out."، "is" و "ran" و "out"
(?! subexpression)الاستدلال المسبق غير العضوي للتنبؤ بالسلب.\b(?!un)\w+\bفي "unsure sure unity used"، "sure" و "used"
(?<=subexpression)الاستدلال المسبق غير العضوي للنطاق الصفر.(?A+B+)في "1ABB 3ABBC 5AB 5AC"، "1ABB" و "3ABB" و "5AB"
using System;
using System.Text.RegularExpressions;
public class Example
{
   public static void Main()
   {
      string input = "1851 1999 1950 1905 2003";
      string pattern = @"(?<=19)\d{2}\b";
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine(match.Value);
   }
}


تشغيل مثال »

محدد

محدد يحدد عدد الأمثلة التي يجب وجود العنصر السابق (يمكن أن يكون حرفًا أو مجموعة أو فئة حروف) في النص المدخل حتى يتم تطابق المثيل. وتشمل محددات العناصر اللغوية المذكورة في الجدول أدناه.

في الجدول أدناه قائمة بمحددات:

محددالوصفالنمطالتنسيق
*التطابق مع العنصر السابق صفر مرة أو أكثر.\d*\.\d".0"، "19.9"، "219.9"
+التطابق مع العنصر السابق مرة واحدة أو أكثر."be+"في "been" يحتوي على "bee"، وفي "bent" يحتوي على "be"
?التنسيق للعنصر السابق يحدث صفر مرة أو مرة واحدة."rai?n""ran"، "rain"
{ n }التنسيق للعنصر السابق يحدث بقدر دقيق مرة واحدة.",\d{3}"في "1,043.6" يحتوي على ",043"، وفي "9,876,543,210" يحتوي على ",876"، و ",543" و ",210"
{ n ,}التنسيق للعنصر السابق يحدث على الأقل مرة واحدة."\d{2,}""166"، "29"، "1930"
{ n , m }التنسيق للعنصر السابق يحدث على الأقل مرة واحدة، ولكن لا يزيد عن m مرة."\d{3,5}""166"، "17668" في "193024" يحتوي على "19302"
*?التنسيق للعنصر السابق يحدث صفر مرة أو مرات متعددة، ولكن بقدر الإمكان مرة واحدة.\d*?\.\d".0"، "19.9"، "219.9"
+?التنسيق للعنصر السابق يحدث مرة واحدة أو مرات متعددة، ولكن بقدر الإمكان مرة واحدة."be+?"في "been" يحتوي على "be"، وفي "bent" يحتوي على "be"
??التنسيق للعنصر السابق يحدث صفر مرة أو مرة واحدة، ولكن بقدر الإمكان مرة واحدة."rai??n""ran"، "rain"
{ n }?التنسيق للعنصر المقدمة يحدث بقدر دقيق مرة واحدة.",\d{3}?"في "1,043.6" يحتوي على ",043"، وفي "9,876,543,210" يحتوي على ",876"، و ",543" و ",210"
{ n ,}?التنسيق للعنصر السابق يحدث على الأقل مرة واحدة، ولكن بقدر الإمكان مرة واحدة."\d{2,}?""166"، "29" و "1930"
{ n , m }?التنسيق للعنصر السابق يحدث بين n و m مرة، ولكن يحدث بقدر الإمكان مرة واحدة."\d{3,5}?""166"، "17668" في "193024" يحتوي على "193" و "024"

بنية الاستدلال

الاستدلال يسمح في نفس تعبير النص النموذجي بتحديد التعبيرات الفرعية التي تم تحديدها مسبقًا.

الجدول أدناه يبين بنيات الاستدلال:

بنية الاستدلالالوصفالنمطالتنسيق
\ الرقمالاستدلال. التحقق من قيمة التعبير المعقود.(\w)\1في "البحث" يحتوي على "ee"
\k< الاسم>الاستدلال بالاسم. التحقق من قيمة التعبير المسمى.(?< الحرف>\w)\k< الحرف>في "البحث" يحتوي على "ee"

البنية البديلة

البنية البديلة تستخدم لتعديل تعبير النص النموذجي لتمكين التنسيق either/or.

الجدول أدناه يبين البنيات البديلة:

البنية البديلةالوصفالنمطالتنسيق
|التنسيق بـ(|) الرأسية (|) للعنصر أيهما كان.th(|e|at)"هذا اليوم. " يحتوي على "ال" و "هذا"
(?( التعبير )نعم | لا )إذا تم تطابق نمط النمط بالتعبير، يتم التطابق. نعم; وإلا يتم تطابق الخيار الاختياري لا جزء. التعبير expression يُفسر كاستدلال غير نسيجي.(?(A)A\d{2}\b|\b\d{3}\b)في "A10 C103 910" A10 و 910
(?( name )نعم | لا )إذا كان هناك تطابق في الفئة المسمى أو الفئة المحتجزة أو المسمى بالرقم، يتم التطابق. نعم; وإلا يتم تطابق الخيار الاختياري لا.(?< quoted>")?(?(quoted).+?"|\S+\s)في "Dogs.jpg "Yiska playing.jpg"" Dogs.jpg و "Yiska playing.jpg"

التبديل

التبديل هو تعبير النمط المستخدم في نمط التبديل.

يُظهر الجدول أدناه الرموز المستخدمة في التبديل:

الرمزالوصفالنمطنمط التبديلالنص الإدخاليالنص الناتج
$رقمتبديل وفقًا للفئة رقم النص المُطابق.\b(\w+)(\s)(\w+)\b$3$2$1"one two""two one"
${الاسم}تبديل وفقًا للفئة المسمى الاسم النص المُطابق.\b(?< word1>\w+)(\s)(?< word2>\w+)\b${word2} ${word1}"one two""two one"
$$تبديل رمز "$".\b(\d+)\s?USD$$$1"103 USD""$103"
$&تبديل نسخة واحدة من التطابق الكامل.(\$*(\d*(\.+\d+)?){1})**$&"$1.30""**$1.30**"
$`تبديل جميع النصوص قبل التطابق.B+$`"AABBCC""AAAACC"
$'تبديل جميع النصوص بعد التطابق.B+$'"AABBCC""AACCCC"
$+تبديل آخر مجموعة محتجزة.B+(C+)$+"AABBCCDD"AACCDD
$_تبديل النص الإدخالي بالكامل.B+$_"AABBCC""AAAABBCCCC"

بناءات الم杂物

يُظهر الجدول أدناه مجموعة متنوعة من بناءات الم杂物:

البناءالوصفالنموذج
(?imnsx-imnsx)يمكن تعيين أو تعطيل الخيارات مثل عدم التمييز بين الأحرف الكبيرة والصغيرة في وسط النمط.\bA(?i)b\w+\b matches "ABA Able Act" with "ABA" and "Able"
(?#comment)تعليقات داخلة. تنتهي هذه التعليقات عند أول قوس موازي م закрыم.\bA(?#matches words starting with A)\w+\b
# [نهاية السطر]التعليقات تبدأ بمفتاح # غير المترجم، وتستمر حتى نهاية السطر.(?x)\bA\w+\b#للتمثيل الكلمات التي تبدأ بحرف A)

فئة Regex

يستخدم الفئة Regex لتمثيل نموذج نصي عادي.

في الجدول أدناه، يتم عرض بعض الطرق الشائعة لـ Regex:

الترقيمالطريقة & الوصف
1public bool IsMatch( string input )
يحدد إذا كانت النصوص العادية المحددة تجد تطابقًا في النص المدخل المحدد.
2public bool IsMatch( string input, int startat )
يحدد إذا كانت النصوص العادية المحددة تجد تطابقًا في النص المدخل المحدد، من الموقع المحدد في النص.
3public static bool IsMatch( string input, string pattern )
يحدد إذا كانت النصوص العادية المحددة تجد تطابقًا في النص المدخل المحدد.
4public MatchCollection Matches( string input )
يبحث في جميع الصفوف التي تتطابق مع النصوص العادية المحددة في النص المدخل.
5public string Replace( string input, string replacement )
يستبدل جميع الصفوف التي تتطابق مع نموذج النصوص العادي المحدد في النص المدخل بالصفة المحددة.
6public string[] Split( string input )
يقوم بتقسيم النص المدخل إلى مجموعة من الأجزاء البنائية بناءً على مواقع التموضع المحددة في نموذج النصوص العادي المحدد في بناء Regex.

للحصول على قائمة كاملة بخصائص Regex، يرجى الرجوع إلى وثائق C# من Microsoft.

مثال 1

في المثال التالي، يتم تطابق الكلمات التي تبدأ بحرف 'S':

مثال على الإنترنت

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = ";A Thousand Splendid Suns";
         Console.WriteLine("Matching words that start with 'S': ");
         showMatch(str, @"\bS\S*");
         Console.ReadKey();
      }
   }
}

عندما يتم تجميع وكود وتنفيذه، سيتم إنتاج النتيجة التالية:

Matching words that start with 'S':
The Expression: \bS\S*
Splendid
Suns

المثال 2

في هذا المثال يتم تطابق الكلمات التي تبدأ ب 'm' وتنتهي ب 'e':

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "make maze and manage to measure it";
         Console.WriteLine("Matching words start with 'm' and ends with 'e':");
         showMatch(str, @"\bm\S*e\b");
         Console.ReadKey();
      }
   }
}

عندما يتم تجميع وكود وتنفيذه، سيتم إنتاج النتيجة التالية:

Matching words start with 'm' and ends with 'e':
The Expression: \bm\S*e\b
صنع
حلقة
إدارة
قياس

المثال 3

في هذا المثال يتم استبدال الفراغات الزائدة:

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         string input = "Hello   World   ";
         string pattern = "\\s+";
         string replacement = " ";
         Regex rgx = new Regex(pattern);
         string result = rgx.Replace(input, replacement);
         Console.WriteLine("النص الأصلي: {0}", input);
         Console.WriteLine("النص البديل: {0}", result);    
         Console.ReadKey();
      }
   }
}

عندما يتم تجميع وكود وتنفيذه، سيتم إنتاج النتيجة التالية:

النص الأصلي: Hello    World   
النص البديل: Hello World