أكثر

تعبير "الحاسبة الميدانية" لاستبدال السلسلة فقط في حالة حدوثها

تعبير


لدي مجالان (شارع 1&AKA_STREET_TEST1).

أواجه مشكلة في إنشاء جملة IF ثم Python بسيطة في مربع Field Calculator. لقد كنت أبحث في المواضيع عن مثال مشابه ولكن دون جدوى. في الأساس ، ستعمل الصيغة شيئًا كهذا.

إذا كان STREET1 يحتوي على "AVENUE" ، فاحسب AKA_STREET_TEST1 إلى "AVE" ، وإلا اتركه فارغًا

(المثال أدناه)

فيما يلي محاولتي الضعيفة لإنشاء بيان if-then.


هناك أمران يجب ملاحظتهما:

تأخذ كتلة التعليمات البرمجية الخاصة بك حاليًا وسيطين ، لكنك تحتاج حقًا إلى استخدام وسيط واحد فقط.AKA_STREET_TEST1هي النتيجة التي تريدها ، وليس شيئًااحسب ()ستأخذ في الاعتبار عند الحساب. لذلك يجب أن يكون تعبيركاحسب (! STREET1!)- لأنك تريد الوظيفةاحسبللقيام بشيء ما باستخدام المعلومات من الميدانشارع 1، وسيتم بعد ذلك تعيين هذه القيمة إلىAKA_STREET_TEST1.

يمكنك استخدام عملية بسيطة من سطر واحد مع Pythonالسلسلةوظيفة ، والتي تدمج بشكل أساسي منطق if-then الخاص بك تلقائيًا. لوالسبيلموجود في السلسلة ، سيتم استبداله بـAVE. لوالسبيلغير موجود ، لا يُرجع شيئًا ويجب أن يترك السمة فارغة.

def Calc (القيمة): إذا كان "AVENUE" بالقيمة: return value.replace ('AVENUE'، 'AVE')

يبدو أن لديك الفكرة الصحيحة ولكنك تختبر ما إذا كان STREET1 يساوي تمامًا "AVENUE". نظرًا لأن STREET1 به رقم الطريق ، فلن يكون متساويًا أبدًا. لذلك ، سوف تحتاج إلى معرفة ما إذا كان يحتوي على AVENUE ، وليس فقط يساوي AVENUE. إذا كنت تستخدم الدالة python find () في سلسلة ولا تحتوي على القيمة التي تحاول العثور عليها ، فستُرجع القيمة -1 ، لذا جرب شيئًا مثل:

def Calc (STREET1): إذا STREET1.find ("AVENUE")! = -1: إرجاع STREET1.replace ("AVENUE" ، "AVE") احسب (! STREET1!)

جرب هذا إذا كنت تقوم بتحديث حقل موجود وطريقةradouxju لملء حقل جديد:

def Calc (STREET1): إرجاع STREET1.replace ('AVENUE'، 'AVE')

يمكنك استخدام دالة find ()

def Calc (street): if street.upper (). find ("AVENUE")> = 0: return street.upper (). replace ("AVENUE"، "AVE")

احسب (! شارع!)

لاحظ أن لغة Python حساسة لحالة الأحرف ، لذا أضفت علامة العلوي () لأخذ جميع الحالات في الاعتبار


def calc (a): إذا كان "AVENUE" في a: إرجاع "AVE" calc (! STREET1!)

التعبيرات العادية 101: Regex في C ++ 11

ليس من غير المألوف استخدام C ++ لمعالجة النصوص على سبيل المثال ، قراءة ملف يحتوي على كود HTML وكتابة ملف آخر يحتوي على نفس الرمز بتنسيق HTML مختلف. هل يمكنك فعل ذلك من خلال قراءة وتحليل شخصية واحدة في كل مرة؟ بالطبع بكل تأكيد. لكن مثل هذه المهام يمكن أن تتطلب الكثير من العمل. تضيف مواصفات C ++ 11 الجديدة إمكانيات التعبيرات العادية (regex) إلى المكتبة القياسية ، والتي يمكن أن تجعل حياتك أسهل.

ببساطة ، التعبير العادي هو نمط نص. إنها نعمة لمعالجة النصوص ، على الرغم من أنها تتيح لك القيام بالكثير من خلال بضعة أسطر فقط من كود C ++. قواعد التعبير العادي هي لغة في حد ذاتها & # 8212 لكنها لغة بسيطة نسبيًا ويسهل تعلمها. باستخدام هذه القواعد ، يمكنك تحديد أنماط للمطابقة والاستبدال (اختياريًا). ثم ، في وقت التشغيل ، يقوم البرنامج ببناء آلة حالة التعبير العادي التي تقوم بمعظم العمل نيابة عنك.

لا تحتاج حقًا إلى معرفة ذلك كيف إنها تعمل. في الواقع ، ما عليك سوى معرفة بعض الأشياء:

  • قواعد التعبير النحوي المستخدمة في C ++ 11 regex وظائف المكتبة
  • وظائف C ++ 11 ذات الصلة وكيفية الاتصال بها

الجزء الأول من هذه المقالة يركز على الافتراضي regex القواعد المستخدمة في C ++ 11: قواعد ECMAScript. ستحتاج عمومًا إلى استخدام ECMAScript ، لأنه يوفر إمكانات قوية مع سهولة الاستخدام. للتبسيط ، سأركز على هذه القواعد.


يبدو أنك تبحث عن:

لاحظ أن IF تأخذ 3 معلمات: تعبير يتم تقييمه إلى صواب أو خطأ ، وما يتم عرضه إذا كان التقييم صحيحًا ، وما الذي سيتم عرضه إذا كان التقييم خاطئًا. يجب عليك توفير الصيغة المحسوبة الحالية بالكامل لمعامل الحالة الخاطئة.

سيبدو المثال المحدد الخاص بك كما يلي:

لاحظ أننا نقدم السلسلة الفارغة ("") للمعلمة الحقيقية ، لأننا نقول إذا كان [Action Closed] فارغًا ، ثم قدم ما يبدو أنه لا قيمة داخل هذا العمود - هذه هي الطريقة التي نعرض بها حقلًا محسوبًا فارغة مثل سؤالك الذي طرح في الأصل.

كما أشجع بشدة أي شخص يبحث عن مزيد من المعلومات حول الأعمدة المحسوبة لسحب مرجع MSDN على: https://msdn.microsoft.com/en-us/library/office/bb862071(v=office.14).aspx

تحصل على رقم -42 ألف شيء لأن التاريخ الفارغ يتم تعيينه افتراضيًا على أقدم تاريخ ماضي يمكن أن يمثله SharePoint ، وهو 31-21-1899 (أو 1900؟)

لذا مثلما أجاب الآخرون ، عليك اختبار قيمة فارغة باستخدام:

مرجع MSDN هو ليس صحيح دائمًا ، راجع قائمة وظائف SharePoint وبناء الجملة التي قمت بتجميعها مؤخرًا.

إذا كنت تقوم بتحرير الصيغ المحسوبة ، فإن تطبيق Calculator Bookmarklet الخاص بي مفيد للغاية أيضًا ، حيث يمنحك ملاحظات فورية أثناء التحرير.

تحديث

سوزان ، من الأسهل استخدام محرر نص عادي عند كتابة الصيغ ، ثم لصقها في SharePoint. سيتجاهل SharePoint كل الأسطر الجديدة حتى تتمكن من نسخ / لصق الصيغ مثل & quot:

يوضح هذا كيف يمكنك عمل وظائف متداخلة ، ولكن يجب أن تكون دقيقًا للغاية مع جميع الفواصل والأقواس!
من شأن تطبيق CalcMaster Bookmarklet الذي نشرته أن يساعدك حقًا ، ولكن قد يتعين عليك أن تطلب من مستخدم محترف في SharePoint مساعدتك في تثبيته.

نصيحة أخرى هي بناءها في Excel ، حيث تحصل على نتائج فورية في ورقة Excel. فقط كن على علم بأن جميع وظائف Excel لا تعمل في SharePoint.

يمكن اختبار الصيغة أعلاه في Excel. لذا احصل عليه بشكل صحيح في Excel أولاً. استبدل أسماء الأعمدة بمراجع خلايا Excel مثل:

إذا كنت لا تعرف كيفية كتابة وظائف Excel ، فتعلمها أولاً. الكثير من الدورات التدريبية عبر الإنترنت حولها.

يشبه SharePoint (Formulas) تعلم ركوب دراجة بدون عجلات جانبية ، لكن الأمر يستحق أن نتحمل بعض السقوط ، والنهوض والمثابرة.

الأسئلة جيدة التنسيق والمفصلة تحصل على إجابات أفضل. كما أن تحديد الإجابات على أنها إجابة يكسبك المزيد من الائتمان.


قم بإرجاع جزء السطر فقط بعد نمط مطابق

لذا ، فإن فتح ملف باستخدام cat ثم استخدام grep للحصول على سطور مطابقة لا يصلني إلا حتى الآن عندما أعمل مع مجموعة السجلات المعينة التي أتعامل معها. يحتاج إلى طريقة لمطابقة الخطوط بنمط ما ، ولكن فقط لإرجاع جزء السطر بعد المباراة. سيختلف الجزء قبل وبعد المباراة باستمرار. لقد لعبت باستخدام sed أو awk ، لكنني لم أتمكن من معرفة كيفية تصفية الخط إما لحذف الجزء قبل المباراة ، أو مجرد إرجاع الجزء بعد المباراة ، وسيعمل أيضًا. هذا مثال على سطر أحتاج إلى تصفيته:

الجزء الذي أحتاجه هو كل شيء بعد "توقف".

الخلفية وراء ذلك هي أنني أستطيع معرفة عدد المرات التي يتوقف فيها شيء ما:

ما علي فعله هو معرفة عدد المرات التي توقفت فيها عقدة معينة (يشار إليها بالجزء الذي يسبق كل نقطتين بعد "توقف". إذا كنت قد فعلت ذلك (على سبيل المثال 20 :) ، فقد ترجع الخطوط التي بها فشل بسيط ، ولكن لا أكشاك ، وهذا لا يساعدني. أحتاج إلى تصفية الجزء المتوقف فقط حتى أتمكن بعد ذلك من الحصول على عقدة معينة من تلك التي توقفت.

لجميع المقاصد والأغراض ، هذا نظام freebsd مع أدوات GNU الأساسية القياسية ، لكن لا يمكنني تثبيت أي شيء إضافي للمساعدة.


استخدم COLTEST لإجراء حسابات شرطية. يمكن لـ COLTEST التحقق من وجود شرط أو أكثر من شروط العمود التالية وإرجاع TRUE إذا تم استيفاء أحد شروط العمود التالية.

PRESENT ، مما يشير إلى وجود عمود في السجل المصدر وليس فارغًا. في سجل مضغوط ، قد تكون الأعمدة مفقودة ، ولكن هذا ليس هو نفس القيمة الخالية.

NULL ، تشير إلى أن العمود موجود و NULL.

مفقود ، مما يشير إلى عدم وجود العمود.

غير صالح ، يشير إلى أن العمود موجود ولكنه يحتوي على بيانات غير صالحة. على سبيل المثال ، حقل PIC 9 (3) الذي يحتوي على مسافات ينتج عنه شرط غير صالح.

اسم الحقل أو العمود الذي يمثل مصدر البيانات قيد الاختبار.

واحد مما يلي: موجود أو مفقود أو غير صالح أو فارغ.

يوضح هذا المثال كيف يمكنك حساب قيمة عمود HIGH_SALARY فقط إذا كان حقل SALARY في السجل المصدر موجودًا وأكبر من رقم معين. قم بإعداد شرط اختبار باستخدام الدالةIF لإرجاع نتيجة الراتب عندما يكون جزء من السجل الحالي ويتجاوز 250000 ، وإلا قم بإرجاع NULL:

في هذا المثال ، يتم تقييم الشرط BASE_SALARY & gt 250000 فقط عندما يكون SALARY موجودًا في السجل المصدر وليس فارغًا. إذا لم يتم اختبار وجود العمود أولاً ، فلن يتم تعيين العمود ، لأن النتيجة كانت مفقودة.

في المثال التالي ، يتم إرجاع 0 عندما يكون حقل AMT مفقودًا أو غير صالح ، وإلا يتم إرجاع AMT.


عوامل OLAP DML

عامل التشغيل هو رمز يحول قيمة أو يدمجها بطريقة ما مع قيمة أخرى. يصف الجدول 2-9 ، "عوامل تشغيل OLAP DML" فئات عوامل تشغيل OLAP DML.

الجدول 2-9 عوامل تشغيل OLAP DML

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

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

عوامل التشغيل AND و OR و NOT التي يمكنك استخدامها لتحويل قيم BOOLEAN باستخدام العمليات المنطقية ، والتي تعرض نتيجة BOOLEAN. للحصول على قائمة العوامل المنطقية ، راجع "المقارنة والعوامل المنطقية". لمزيد من المعلومات حول تعبيرات BOOLEAN ، راجع "التعبيرات المنطقية".

عامل تشغيل تستخدمه لتعيين نتائج تعبير إلى كائن أو لتعيين قيمة إلى خيار OLAP DML. لمزيد من المعلومات حول استخدام عبارات التخصيص ، راجع الأمرين SET و SET1 و "عامل التعيين".

إذا. من ثم. عوامل تشغيل ELSE و SWITCH و CASE التي يمكنك استخدامها للاختيار بين القيم بناءً على شرط. لمزيد من المعلومات ، راجع "التعبيرات الشرطية".

عامل التشغيل & amp (علامة العطف) الذي يمكنك استخدامه لتقييم تعبير واستبدال القيمة الناتجة. لمزيد من المعلومات ، راجع "تعبيرات الاستبدال".

العمليات الحسابية

يوضح الجدول 2-10 "العوامل الحسابية" عوامل التشغيل الحسابية OLAP DML وعملياتها وأولويتها حيث تكون الأولوية هي الترتيب الذي يتم من خلاله تقييم عامل التشغيل هذا. يتم تقييم العوامل التي لها نفس الأولوية من اليسار إلى اليمين. عند استخدام عاملين أو أكثر في تعبير رقمي ، يتم تقييم التعبير وفقًا لقواعد حسابية قياسية. يجب عليك ترميز فاصلة قبل رقم سالب يتبع تعبيرًا رقميًا آخر ، أو يتم تفسير علامة الطرح على أنها عامل طرح. على سبيل المثال ، intvar ، -4

الجدول 2-10 العمليات الحسابية

المقارنة والعوامل المنطقية

يمكنك استخدام عوامل المقارنة والعوامل المنطقية لتكوين التعبيرات بنفس طريقة العوامل الحسابية. لكل عامل أولوية تحدد ترتيب التقييم الخاص به. يتم تقييم العوامل ذات الأولوية المتساوية من اليسار إلى اليمين ، ما لم تغير الأقواس ترتيب التقييم. ومع ذلك ، يتم إيقاف التقييم عندما يتم تحديد قيمة الحقيقة.

يوضح الجدول 2-11 ، "المقارنة والعوامل المنطقية" عوامل مقارنة OLAP DML والعوامل المنطقية (AND و OR و NOT). يسرد عامل التشغيل والعمليات والمثال والأولوية حيث تكون الأولوية هي الترتيب الذي يتم من خلاله تقييم هذا العامل. يتم تقييم العوامل التي لها نفس الأولوية من اليسار إلى اليمين.

الجدول 2-11 المقارنة والعوامل المنطقية

إرجاع عكس تعبير BOOLEAN

هل تاريخ في فترة زمنية؟

"1Jan02" في myDimension = نعم

هل تتطابق قيمة النص مع نمط نص محدد؟

كلا التعبيرين صحيحان

كلا التعبيرين صحيح

مهمة تشغيل

في OLAP DML ، كما هو الحال في العديد من لغات البرمجة الأخرى ، يتم استخدام علامة = (يساوي) كعامل تعيين.

ينشئ التعبير بيانات مؤقتة يمكنك عرض القيم الناتجة عنها ، ولكن لا يتم تخزين هذه القيم تلقائيًا في مساحة العمل التحليلية للرجوع إليها في المستقبل أثناء الجلسة. يمكنك استخدام عبارة الإسناد لتخزين نتيجة أحد التعبيرات في كائن له نفس نوع البيانات والأبعاد مثل التعبير. إذا قمت بتحديث الكائن وتثبيته ، فستتوفر لك القيم في الجلسات المستقبلية.

مثل لغات البرمجة الأخرى ، تعين عبارة الإسناد في OLAP DML قيمة التعبير الهدف مساوية لنتائج التعبير المصدر. ومع ذلك ، فإن عبارة تخصيص OLAP DML لا تعمل تمامًا كما تعمل في لغات البرمجة الأخرى. مثل العديد من عبارات OLAP DML الأخرى ، فإنه لا يقوم بتعيين قيمة لخلية واحدة ، بدلاً من ذلك ، عندما يكون تعبير الهدف عبارة عن كائن متعدد الأبعاد ، يقوم Oracle OLAP بالتكرار عبر خلايا الكائن الهدف مع ضبط كل واحدة على نتائج التعبير المصدر . بالإضافة إلى ذلك ، يمكنك استخدام UNAVEL لنسخ قيم التعبير إلى خلايا الكائن الهدف عندما تكون أبعاد التعبير مختلفة عن أبعاد الكائن الهدف.

لمزيد من المعلومات حول استخدام عبارات التعيين في OLAP DML ، راجع SET و SET1.


تعبير "الحاسبة الميدانية" لاستبدال السلسلة فقط في حالة حدوثها - أنظمة المعلومات الجغرافية

إذا كانت لديك احتياجات مطابقة الأنماط تتجاوز هذا ، ففكر في كتابة دالة معرفة من قبل المستخدم في Perl أو Tcl.

حذر

بينما يمكن تنفيذ معظم عمليات البحث عن التعبير العادي بسرعة كبيرة ، يمكن اختراع التعبيرات العادية التي تستغرق قدرًا تعسفيًا من الوقت والذاكرة لمعالجتها. احذر من قبول أنماط البحث ذات التعبير العادي من مصادر معادية. إذا كان لا بد من القيام بذلك ، فمن المستحسن فرض مهلة بيان.

عمليات البحث التي تستخدم أنماط SIMILAR TO لها نفس مخاطر الأمان ، نظرًا لأن SIMILAR TO توفر العديد من الإمكانات نفسها التي توفرها التعبيرات العادية بنمط POSIX.

مثل عمليات البحث ، كونها أبسط بكثير من الخيارين الآخرين ، فهي أكثر أمانًا للاستخدام مع مصادر الأنماط التي قد تكون معادية.

لا تدعم عوامل مطابقة الأنماط من جميع الأنواع الثلاثة عمليات الترتيب غير المحددة. إذا لزم الأمر ، قم بتطبيق ترتيب مختلف على التعبير للتغلب على هذا القيد.

9.7.1. مثل

يعود التعبير LIKE صحيحًا إذا كان الملف سلسلة يطابق نمط . (كما هو متوقع ، يعرض تعبير NOT LIKE false إذا أعاد LIKE القيمة true ، والعكس صحيح. والتعبير المكافئ هو NOT ( سلسلة مثل نمط ) .)

لو نمط لا يحتوي على علامات النسبة المئوية أو الشرطات السفلية ، فإن النمط لا يمثل سوى السلسلة نفسها في هذه الحالة ، حيث يعمل LIKE مثل عامل التشغيل equals. تسطير أسفل السطر (_) في نمط لتقف على (تطابق) أي حرف واحد ، فإن علامة النسبة المئوية (٪) تطابق أي تسلسل من صفر أو أكثر من الأحرف.

مثل مطابقة النمط تغطي دائمًا السلسلة بأكملها. لذلك ، إذا كان من المطلوب مطابقة تسلسل في أي مكان داخل السلسلة ، فيجب أن يبدأ النمط وينتهي بعلامة النسبة المئوية.

لمطابقة شرطة سفلية أو علامة النسبة المئوية دون مطابقة الأحرف الأخرى ، يجب استخدام الحرف المقابل في نمط يجب أن يسبقه حرف الإلغاء. حرف الهروب الافتراضي هو الشرطة المائلة للخلف ولكن يمكن تحديد حرف مختلف باستخدام جملة ESCAPE. لمطابقة حرف الهروب نفسه ، اكتب حرفين للهروب.

إذا تم إيقاف تشغيل standard_conforming_strings ، فستحتاج إلى مضاعفة أي خطوط مائلة عكسية تكتبها في ثوابت السلسلة الحرفية. انظر القسم 4.1.2.1 لمزيد من المعلومات.

من الممكن أيضًا تحديد عدم وجود حرف هروب بكتابة ESCAPE ". يؤدي هذا إلى تعطيل آلية الهروب بشكل فعال ، مما يجعل من المستحيل إيقاف تشغيل المعنى الخاص للشرطة السفلية وعلامات النسبة المئوية في النموذج.

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

يمكن استخدام الكلمة الأساسية ILIKE بدلاً من LIKE لجعل المطابقة غير حساسة لحالة الأحرف وفقًا للإعدادات المحلية النشطة. هذا ليس في معيار SQL ولكنه امتداد PostgreSQL.

يعادل LIKE و

* يتوافق مع ILIKE. هناك أيضا !

* عوامل التشغيل التي تمثل NOT LIKE و NOT ILIKE ، على التوالي. كل هذه العوامل خاصة بـ PostgreSQL. قد ترى أسماء عوامل التشغيل هذه في إخراج EXPLAIN وأماكن مماثلة ، نظرًا لأن المحلل اللغوي يترجم بالفعل LIKE et al. لهؤلاء المشغلين.

يتم التعامل مع العبارات LIKE و ILIKE و NOT LIKE و NOT ILIKE عمومًا على أنها عوامل تشغيل في بناء جملة PostgreSQL ، على سبيل المثال ، يمكن استخدامها في التعبير المشغل أو العامل أي ( استعلام فرعي ) ، على الرغم من أنه لا يمكن تضمين بند ESCAPE هناك. في بعض الحالات الغامضة ، قد يكون من الضروري استخدام أسماء المشغلين الأساسية بدلاً من ذلك.

راجع أيضًا عامل التشغيل البادئة ^ @ والوظيفة المقابلة start_with ، والتي تكون مفيدة في الحالات التي تتطلب مجرد مطابقة بداية السلسلة.

9.7.2. على غرار التعبيرات العادية

يعيد عامل التشغيل SIMILAR TO صواب أو خطأ اعتمادًا على ما إذا كان نمطه يطابق السلسلة المحددة. إنه مشابه لـ LIKE ، إلا أنه يفسر النمط باستخدام تعريف معيار SQL للتعبير العادي. تعبيرات SQL العادية هي تقاطع غريب بين تدوين LIKE وتدوين التعبير العادي (POSIX).

مثل LIKE ، لا ينجح عامل التشغيل SIMILAR TO إلا إذا كان النمط الخاص به يطابق السلسلة بأكملها ، وهذا يختلف عن سلوك التعبير العادي الشائع حيث يمكن للنمط أن يتطابق مع أي جزء من السلسلة. أيضًا مثل LIKE ، يستخدم SIMILAR TO _ و٪ كأحرف بدل للإشارة إلى أي حرف مفرد وأي سلسلة ، على التوالي (هذه قابلة للمقارنة مع. و. * في تعبيرات POSIX العادية).

بالإضافة إلى هذه التسهيلات المستعارة من LIKE ، يدعم ما يشبه ذلك الأحرف الأولية لمطابقة الأنماط المستعارة من تعبيرات POSIX العادية:

| يشير إلى التناوب (أي من بديلين).

* تشير إلى تكرار العنصر السابق صفر أو أكثر من المرات.

+ يشير إلى تكرار العنصر السابق مرة واحدة أو أكثر.

؟ يشير إلى تكرار العنصر السابق صفرًا أو مرة واحدة.

< م > تشير إلى تكرار العنصر السابق بالضبط م مرات.

< م ،> تشير إلى تكرار العنصر السابق م أو مرات أكثر.

< م , ن > تشير إلى تكرار العنصر السابق على الأقل م وليس أكثر من ن مرات.

يمكن استخدام الأقواس () لتجميع العناصر في عنصر منطقي واحد.

تعبير القوس [. ] يحدد فئة الحرف ، تمامًا كما هو الحال في تعبيرات POSIX العادية.

لاحظ أن النقطة (.) ليست حرفًا أوليًا لـ SIMILAR TO.

كما هو الحال مع LIKE ، تعمل الشرطة المائلة للخلف على تعطيل المعنى الخاص لأي من هذه الأحرف الأولية. يمكن تحديد حرف هروب مختلف باستخدام ESCAPE ، أو يمكن تعطيل إمكانية الهروب بكتابة ESCAPE ''.

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

امتداد آخر غير قياسي هو أن اتباع حرف الهروب بحرف أو رقم يوفر الوصول إلى تسلسلات الهروب المحددة لتعبيرات POSIX العادية ، انظر الجدول 9.20 والجدول 9.21 والجدول 9.22 أدناه.

توفر وظيفة السلسلة الفرعية ذات المعلمات الثلاث استخراج سلسلة فرعية تطابق نمط التعبير العادي لـ SQL. يمكن كتابة الوظيفة وفقًا لبناء جملة SQL99:

أو كدالة بسيطة من ثلاث وسيطات:

كما هو الحال مع SIMILAR TO ، يجب أن يتطابق النمط المحدد مع سلسلة البيانات بأكملها ، وإلا فشلت الوظيفة وإرجاع فارغة. للإشارة إلى جزء النمط الذي تكون فيه السلسلة الفرعية للبيانات المطابقة ذات أهمية ، يجب أن يحتوي النمط على تكراري حرف الهروب متبوعًا بعلامة اقتباس مزدوجة ("). النص المطابق لجزء النمط بين هذه الفواصل هو عاد عندما تكون المباراة ناجحة.

تقسم فواصل التنصيص المزدوجة في الواقع نمط السلسلة الفرعية إلى ثلاثة تعبيرات منتظمة مستقلة على سبيل المثال ، يؤثر الشريط العمودي (|) في أي من الأقسام الثلاثة على هذا المقطع فقط. أيضًا ، يتم تعريف التعبيرات العادية الأولى والثالثة لمطابقة أصغر قدر ممكن من النص ، وليس الأكبر ، عندما يكون هناك أي غموض حول مقدار تطابق سلسلة البيانات مع النمط. (في لغة POSIX ، يتم إجبار التعبيرين العاديين الأول والثالث على عدم الجشع.)

كامتداد لمعيار SQL ، تسمح PostgreSQL بوجود فاصل واحد فقط للاقتباس المزدوج ، وفي هذه الحالة يتم أخذ التعبير العادي الثالث على أنه فارغ أو بدون فواصل ، وفي هذه الحالة يتم اعتبار التعبيرات العادية الأولى والثالثة فارغة .

بعض الأمثلة ، مع # "تحديد سلسلة الإرجاع:

9.7.3. التعبيرات العادية POSIX

يسرد الجدول 9.16 عوامل التشغيل المتاحة لمطابقة الأنماط باستخدام تعبيرات POSIX العادية.

الجدول 9.16. عوامل مطابقة التعبير العادي

تتطابق السلسلة مع التعبير العادي ، وتتوافق مع حالة الأحرف

تطابق String التعبير العادي ، بشكل غير حساس لحالة الأحرف

لا تتطابق السلسلة مع التعبير العادي ، فهي حساسة لحالة الأحرف

لا تتطابق السلسلة مع التعبير العادي ، ولا تتطابق مع حالة الأحرف

التعبير العادي هو تسلسل أحرف يمثل تعريفًا مختصرًا لمجموعة من السلاسل (a مجموعة منتظمة). يُقال أن السلسلة تتطابق مع تعبير عادي إذا كانت عضوًا في المجموعة العادية الموصوفة في التعبير العادي. كما هو الحال مع LIKE ، تطابق أحرف النمط أحرف السلسلة تمامًا ما لم تكن أحرفًا خاصة في لغة التعبير العادي - لكن التعبيرات العادية تستخدم أحرفًا خاصة مختلفة عن LIKE. بخلاف أنماط LIKE ، يُسمح للتعبير العادي بمطابقة أي مكان داخل سلسلة ، ما لم يتم ربط التعبير العادي صراحةً ببداية السلسلة أو نهايتها.

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

توفر وظيفة regexp_replace استبدال النص الجديد بالسلاسل الفرعية التي تطابق أنماط التعبير العادي لـ POSIX. يحتوي على صيغة regexp_replace ( مصدر , نمط , إستبدال [ , الأعلام ]). ال مصدر يتم إرجاع السلسلة دون تغيير إذا لم يكن هناك تطابق مع نمط . إذا كان هناك تطابق ، فإن مصدر يتم إرجاع السلسلة بامتداد إستبدال تم استبدال السلسلة بسلسلة فرعية مطابقة. ال إستبدال يمكن أن تحتوي السلسلة على ن ، أين ن من 1 إلى 9 ، للإشارة إلى أن السلسلة الفرعية المصدر تتطابق مع ن يجب إدراج التعبير الفرعي المحصور بين قوسين للنمط ، ويمكن أن يحتوي على & amp للإشارة إلى أنه يجب إدراج السلسلة الفرعية المطابقة للنمط بأكمله. اكتب إذا كنت تريد وضع شرطة مائلة للخلف في النص البديل. ال الأعلام المعلمة عبارة عن سلسلة نصية اختيارية تحتوي على صفر أو أكثر من العلامات أحادية الحرف التي تغير سلوك الوظيفة. تحدد العلامة i المطابقة غير الحساسة لحالة الأحرف ، بينما تحدد العلامة g استبدال كل سلسلة فرعية مطابقة بدلاً من الأولى فقط. الأعلام المدعومة (وإن لم تكن ز) موصوفة في الجدول 9.24.

تعرض الدالة regexp_match مصفوفة نصية من السلاسل الفرعية الملتقطة الناتجة عن التطابق الأول لنمط التعبير العادي POSIX مع سلسلة. يحتوي على صيغة regexp_match ( سلسلة , نمط [ , الأعلام ]). إذا لم يكن هناك تطابق ، تكون النتيجة NULL. إذا تم العثور على تطابق ، و نمط لا يحتوي على تعبيرات فرعية بين قوسين ، فإن النتيجة تكون مصفوفة نصية مكونة من عنصر واحد تحتوي على السلسلة الفرعية المطابقة للنمط بأكمله. إذا تم العثور على تطابق ، و نمط يحتوي على تعبيرات فرعية بين قوسين ، ثم تكون النتيجة مصفوفة نصية بها ن العنصر هو السلسلة الفرعية التي تطابق ن 'th بين قوسين من التعبير الجزئي لـ نمط (بدون احتساب الأقواس "غير الملتقطة" انظر أدناه للحصول على التفاصيل). ال الأعلام المعلمة عبارة عن سلسلة نصية اختيارية تحتوي على صفر أو أكثر من العلامات أحادية الحرف التي تغير سلوك الوظيفة. يتم وصف العلامات المدعومة في الجدول 9.24.

في الحالة الشائعة حيث تريد فقط السلسلة الفرعية المطابقة بالكامل أو NULL بدون تطابق ، اكتب شيئًا مثل

تعرض الدالة regexp_matches مجموعة من المصفوفات النصية للسلاسل الفرعية الملتقطة الناتجة عن مطابقة نمط التعبير العادي POSIX مع سلسلة. لها نفس بناء الجملة مثل regexp_match. لا تُرجع هذه الدالة أي صفوف إذا لم يكن هناك تطابق ، أو إذا كان هناك صف واحد متطابق ولم يتم إعطاء علامة g ، أو ن الصفوف إذا كان هناك ن مباريات ويتم إعطاء العلم g. كل صف تم إرجاعه عبارة عن مصفوفة نصية تحتوي على السلسلة الفرعية المطابقة بالكامل أو السلاسل الفرعية التي تطابق التعبيرات الفرعية بين قوسين من نمط ، تمامًا كما هو موضح أعلاه لـ regexp_match. تقبل regexp_matches جميع العلامات الموضحة في الجدول 9.24 ، بالإضافة إلى علامة g التي تأمرها بإرجاع جميع التطابقات ، وليس الأولى فقط.

في معظم الحالات ، يجب استخدام regexp_matches () مع علامة g ، لأنه إذا كنت تريد المطابقة الأولى فقط ، فمن الأسهل والأكثر كفاءة استخدام regexp_match (). ومع ذلك ، لا يوجد regexp_match () إلا في الإصدار 10 من PostgreSQL والإصدارات الأحدث. عند العمل في الإصدارات القديمة ، فإن الحيلة الشائعة هي إجراء استدعاء regexp_matches () في تحديد فرعي ، على سبيل المثال:

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

تقسم الدالة regexp_split_to_table سلسلة باستخدام نمط التعبير العادي POSIX كمحدد. يحتوي على بناء الجملة regexp_split_to_table ( سلسلة , نمط [ , الأعلام ]). إذا لم يكن هناك تطابق مع نمط ، تقوم الدالة بإرجاع سلسلة . إذا كان هناك تطابق واحد على الأقل ، فإنه يعيد النص من نهاية التطابق الأخير (أو بداية السلسلة) إلى بداية المباراة. عندما لا يكون هناك المزيد من التطابقات ، فإنه يعيد النص من نهاية المباراة الأخيرة إلى نهاية السلسلة. ال الأعلام المعلمة عبارة عن سلسلة نصية اختيارية تحتوي على صفر أو أكثر من العلامات أحادية الحرف التي تغير سلوك الوظيفة. يدعم regexp_split_to_table الإشارات الموضحة في الجدول 9.24.

تتصرف الدالة regexp_split_to_array بنفس سلوك regexp_split_to_table ، باستثناء أن regexp_split_to_array تُرجع نتيجتها كمصفوفة نصية. يحتوي على بناء الجملة regexp_split_to_array ( سلسلة , نمط [ , الأعلام ]). المعلمات هي نفسها الخاصة بـ regexp_split_to_table.

كما يوضح المثال الأخير ، تتجاهل وظائف تقسيم regexp المطابقات ذات الطول الصفري التي تحدث في بداية السلسلة النصية أو نهايتها أو بعد التطابق السابق مباشرةً. يتعارض هذا مع التعريف الصارم لمطابقة regexp الذي يتم تنفيذه بواسطة regexp_match و regexp_matches ، ولكنه عادةً ما يكون هو السلوك الأكثر ملاءمة في الممارسة العملية. تستخدم أنظمة البرامج الأخرى مثل Perl تعريفات مشابهة.

9.7.3.1. تفاصيل التعبير العادي

يتم تنفيذ التعبيرات العادية لـ PostgreSQL باستخدام حزمة برامج كتبها هنري سبنسر. تم نسخ الكثير من وصف التعبيرات النمطية أدناه حرفياً من دليله.

تفترض PostgreSQL دائمًا في البداية أن التعبير النمطي يتبع قواعد ARE. ومع ذلك ، يمكن اختيار قواعد ERE أو BRE الأكثر تحديدًا عن طريق إضافة ملف خيار راسخ إلى نمط الطاقة المتجددة ، كما هو موضح في القسم 9.7.3.4. يمكن أن يكون هذا مفيدًا للتوافق مع التطبيقات التي تتوقع قواعد POSIX 1003.2 بالضبط.

يتم تعريف التعبير العادي على أنه واحد أو أكثر الفروعمفصولة بعلامة | . يطابق أي شيء يطابق أحد الفروع.

الفرع صفر أو أكثر الذرات الكمية أو القيود، متسلسلة. يطابق تطابقًا مع الأول ، متبوعًا بمطابقة للثاني ، إلخ. فرع فارغ يطابق السلسلة الفارغة.

ذرة كمية هي ذرة ربما يتبعه واحد محدد الكم. بدون محدد كمي ، فإنه يطابق تطابقًا للذرة. باستخدام المُحدِّد الكمي ، يمكن أن يتطابق مع عدد من مطابقات الذرة. ان ذرة يمكن أن يكون أيًا من الاحتمالات الموضحة في الجدول 9.17. المحددات الكمية المحتملة ومعانيها موضحة في الجدول 9.18.

أ قيد تتطابق مع سلسلة فارغة ، ولكنها تتطابق فقط عند استيفاء شروط معينة. يمكن استخدام القيد حيث يمكن استخدام الذرة ، باستثناء أنه لا يمكن أن يتبعه مُحدِّد كمي. يتم عرض القيود البسيطة في الجدول 9.19 يتم وصف المزيد من القيود لاحقًا.

الجدول 9.17. ذرات التعبير العادي

ذرة وصف
( إعادة ) (أين إعادة هو أي تعبير عادي) يتطابق مع إعادة ، مع الإشارة إلى المباراة من أجل الإبلاغ المحتمل
(?: إعادة ) على النحو الوارد أعلاه ، ولكن لم تتم الإشارة إلى المطابقة للإبلاغ (مجموعة من الأقواس "غير الملتقطة") (المناطق فقط)
. يطابق أي حرف واحد
[ حرف ] أ تعبير قوس، مطابقة أي واحد من حرف (انظر القسم 9.7.3.2 لمزيد من التفاصيل)
ك (أين ك هو حرف غير أبجدي رقمي) يطابق ذلك الحرف المأخوذ كحرف عادي ، على سبيل المثال ، يطابق حرف الخط المائل للخلف
ج أين ج هو أبجدي رقمي (ربما متبوعًا بأحرف أخرى) هو ملف هرب، راجع القسم 9.7.3.3 (AREs فقط في EREs و BREs ، هذه مطابقة ج )
< عندما يتبعه حرف غير رقم ، يتطابق مع حرف القوس الأيسر <عندما يتبعه رقم ، فهو بداية مرتبط ب (انظر أدناه)
x أين x هو حرف واحد ليس له أهمية أخرى ، يطابق تلك الشخصية

لا يمكن أن تنتهي RE بشرطة مائلة للخلف ().

إذا تم إيقاف تشغيل standard_conforming_strings ، فستحتاج إلى مضاعفة أي خطوط مائلة عكسية تكتبها في ثوابت السلسلة الحرفية. انظر القسم 4.1.2.1 لمزيد من المعلومات.

الجدول 9.18. محددات التعبير العادي

محدد الكم اعواد الكبريت
* سلسلة من 0 أو أكثر من تطابق الذرة
+ سلسلة من 1 أو أكثر من تطابق الذرة
? سلسلة من 0 أو 1 تطابق من الذرة
< م > تسلسل بالضبط م مباريات الذرة
< م ,> تسلسل من م أو أكثر من تطابقات الذرة
< م , ن > تسلسل من م عبر ن (ضمنا) مباريات الذرة م لا يمكن التجاوز ن
*? نسخة غير جشعة من *
+? نسخة غير جشعة من +
?? نسخة غير الجشع؟
< م >? نسخة غير جشعة من < م >
< م ,>? نسخة غير جشعة من < م ,>
< م , ن >? نسخة غير جشعة من < م , ن >

النماذج التي تستخدم < . > تُعرف باسم الحدود. الارقام م و ن داخل الحد توجد أعداد صحيحة عشرية بدون إشارة مع القيم المسموح بها من 0 إلى 255 ضمناً.

غير الجشع تتطابق المحددات الكمية (المتوفرة في ARE فقط) مع نفس الاحتمالات مثل الطبيعي المقابل (جشع) النظراء ، لكنهم يفضلون العدد الأصغر بدلاً من العدد الأكبر من التطابقات. انظر القسم 9.7.3.5 لمزيد من التفاصيل.

لا يمكن للمحدِّد الكمي أن يتبع مُحدِّدًا كميًا آخر على الفور ، على سبيل المثال ، ** غير صالح. لا يمكن للمحدِّد الكمي أن يبدأ تعبيرًا أو تعبيرًا فرعيًا أو أن يتبع ^ أو | .

الجدول 9.19. قيود التعبير العادي

قيد وصف
^ يطابق في بداية السلسلة
$ يطابق في نهاية السلسلة
(?= إعادة ) نظرة إيجابية يطابق في أي نقطة حيث تتطابق سلسلة فرعية إعادة يبدأ (هي فقط)
(?! إعادة ) نظرة سلبية يطابق في أي وقت حيث لا توجد مطابقة سلسلة فرعية إعادة يبدأ (هي فقط)
(؟ & lt = إعادة ) نظرة إيجابية للخلف يطابق في أي نقطة حيث تتطابق سلسلة فرعية إعادة ينتهي (هي فقط)
(؟ & lt! إعادة ) البحث الخلفي السلبي يطابق في أي وقت حيث لا توجد مطابقة سلسلة فرعية إعادة ينتهي (هي فقط)

لا يمكن أن تحتوي قيود Lookahead و lookbehind على الرجوع المراجع (راجع القسم 9.7.3.3) ، وتعتبر جميع الأقواس بداخلها غير ملتقطة.

9.7.3.2. تعبيرات الأقواس

أ تعبير قوس هي قائمة بالأحرف الموجودة في []. يتطابق عادةً مع أي حرف واحد من القائمة (ولكن انظر أدناه). إذا كانت القائمة تبدأ بـ ^ ، فإنها تطابق أي حرف واحد ليس من بقية القائمة. إذا تم الفصل بين حرفين في القائمة بعلامة - ، فهذا اختصار للمجموعة الكاملة من الأحرف بين هذين (بما في ذلك) في تسلسل الترتيب ، على سبيل المثال ، [0-9] في ASCII يطابق أي رقم عشري. من غير القانوني أن يتشارك نطاقان في نقطة نهاية ، على سبيل المثال ، a-c-e. تعتمد النطاقات بشكل كبير على تسلسل التجميع ، لذا يجب على البرامج المحمولة تجنب الاعتماد عليها.

لتضمين حرف] في القائمة ، اجعله الحرف الأول (بعد ^ ، إذا تم استخدامه). لتضمين حرف - ، اجعله الحرف الأول أو الأخير ، أو نقطة النهاية الثانية للنطاق. لاستخدام حرفي - كنقطة نهاية أولى للنطاق ، قم بتضمينه في [. و.] لجعله عنصرًا تجميعيًا (انظر أدناه). باستثناء هذه الأحرف ، بعض التركيبات التي تستخدم [(انظر الفقرات التالية) ، وحروف الهروب (ARE فقط) ، تفقد جميع الأحرف الخاصة الأخرى أهميتها الخاصة داخل تعبير القوس. على وجه الخصوص ، ليس خاصًا عند اتباع قواعد ERE أو BRE ، على الرغم من أنه خاص (مثل إدخال هروب) في ARE.

داخل تعبير قوس ، عنصر مرتب (حرف ، تسلسل متعدد الأحرف يتم تجميعه كما لو كان حرفًا واحدًا ، أو اسم تسلسل ترتيب لأي منهما) محاطًا بـ [. و.] لتقف على تسلسل أحرف هذا العنصر المرتب. يتم التعامل مع التسلسل كعنصر واحد من قائمة تعبير الأقواس. يسمح هذا بتعبير قوس يحتوي على عنصر تجميع متعدد الأحرف لمطابقة أكثر من حرف واحد ، على سبيل المثال ، إذا كان تسلسل التجميع يتضمن عنصر ترتيب ch ، فإن RE [[.ch.]] * c يطابق الأحرف الخمسة الأولى من chchcc .

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

ضمن تعبير القوس ، عنصر الترتيب المضمن في [= و =] هو فئة التكافؤ، ترمز إلى تسلسل الأحرف لجميع عناصر الترتيب المكافئة لذلك العنصر ، بما في ذلك نفسه. (إذا لم تكن هناك عناصر تجميع مكافئة أخرى ، فستكون المعالجة كما لو كانت محددات التضمين [. و.].) على سبيل المثال ، إذا كانت o و ^ أعضاء في فئة التكافؤ ، إذن [[= o =]] ، [[= ^ =]] و [o ^] كلها مترادفة. لا يمكن أن تكون فئة التكافؤ نقطة نهاية النطاق.

ضمن تعبير القوس ، يشير اسم فئة الحرف المضمن في [: و:] إلى قائمة بجميع الأحرف التي تنتمي إلى تلك الفئة. لا يمكن استخدام فئة الحرف كنقطة نهاية لنطاق. يحدد معيار POSIX أسماء فئات الأحرف هذه: alnum (أحرف وأرقام رقمية) ، ألفا (أحرف) ، فارغ (مسافة وعلامة جدولة) ، cntrl (أحرف التحكم) ، رقم (أرقام رقمية) ، رسم بياني (أحرف قابلة للطباعة باستثناء المسافة) ، أقل (الأحرف الصغيرة) ، والطباعة (الأحرف القابلة للطباعة بما في ذلك المسافة) ، وعلامات الترقيم (علامات الترقيم) ، والمسافة (أي مسافة بيضاء) ، والكبيرة (الأحرف الكبيرة) ، و xdigit (الأرقام السداسية العشرية). يكون سلوك فئات الأحرف القياسية هذه متسقًا بشكل عام عبر الأنظمة الأساسية للأحرف في مجموعة ASCII المكونة من 7 بتات. يعتمد ما إذا كان أحد الأحرف غير ASCII على أنه ينتمي إلى إحدى هذه الفئات أم لا التجميع تُستخدم لوظيفة التعبير العادي أو عامل التشغيل (راجع القسم 23.2) ، أو افتراضيًا في إعداد الإعدادات المحلية LC_CTYPE لقاعدة البيانات (انظر القسم 23.1). يمكن أن يختلف تصنيف الأحرف غير ASCII عبر الأنظمة الأساسية حتى في الإعدادات المحلية ذات الأسماء المتشابهة. (لكن لغة C لا تعتبر أبدًا أي أحرف غير ASCII تنتمي إلى أي من هذه الفئات.) بالإضافة إلى فئات الأحرف القياسية هذه ، تحدد PostgreSQL فئة أحرف ascii ، والتي تحتوي بالضبط على مجموعة ASCII المكونة من 7 بتات.

هناك حالتان خاصتان لتعبيرات الأقواس: تعابير الأقواس [[: & lt:]] و [[: & gt:]] هي قيود ، تطابق السلاسل الفارغة في بداية الكلمة ونهايتها على التوالي.يتم تعريف الكلمة على أنها سلسلة من أحرف الكلمات التي لا يسبقها ولا يتبعها أحرف كلمة. حرف الكلمة هو حرف alnum (كما هو محدد بواسطة فئة أحرف POSIX الموضحة أعلاه) أو شرطة سفلية. هذا امتداد ، متوافق مع POSIX 1003.2 ولكن لم يحدده ، ويجب استخدامه بحذر في البرامج المعدّة لتكون محمولة على أنظمة أخرى. عادةً ما تكون عمليات الهروب من القيد الموضحة أدناه مفضلة ، فهي ليست قياسية أكثر ، ولكن يسهل كتابتها.

9.7.3.3. هروب التعبير العادي

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

هروب إدخال الأحرف موجودة لتسهيل تحديد الأحرف غير المطبوعة وغيرها من الأحرف غير الملائمة في REs. يتم عرضها في الجدول 9.20.

يهرب الاختزال الطبقي تقديم اختصارات لبعض فئات الأحرف شائعة الاستخدام. يتم عرضها في الجدول 9.21.

أ هروب القيد هو قيد ، يطابق السلسلة الفارغة إذا تم استيفاء شروط معينة ، ويتم كتابته على أنه هروب. يتم عرضها في الجدول 9.22.

أ المرجع الخلفي ( ن ) نفس السلسلة المطابقة للتعبير الفرعي السابق بين قوسين المحدد بالرقم ن (انظر الجدول 9.23). على سبيل المثال ، ([bc]) 1 يتطابق مع bb أو cc ولكن ليس bc أو cb. يجب أن يسبق التعبير الجزئي بالكامل المرجع الخلفي في RE. يتم ترقيم التعبيرات الفرعية بترتيب أقواسها البادئة. الأقواس غير الملتقطة لا تحدد التعبيرات الفرعية.

الجدول 9.20. هروب إدخال أحرف التعبير العادي

يهرب وصف
أ حرف التنبيه (الجرس) ، كما هو الحال في C
ب backspace ، كما في C
ب مرادف للشرطة المائلة للخلف () للمساعدة في تقليل الحاجة إلى مضاعفة الخط المائل العكسي
ج X (أين X هو أي حرف) الحرف الذي تكون 5 بتات ذات الترتيب المنخفض هي نفسها تلك الموجودة في X ، والتي تكون جميع وحداتها الأخرى صفرًا
هـ الحرف الذي يكون اسم تسلسل الترتيب هو ESC ، أو إذا فشل ذلك ، فإن الحرف ذو القيمة الثمانية 033
F تغذية النموذج ، كما في C
ن newline ، كما في C
r إرجاع حرف ، كما في C
t علامة تبويب أفقية ، كما في C
u wxyz (أين wxyz هو بالضبط أربعة أرقام سداسية عشرية) الحرف الذي قيمته السداسية العشرية هي 0x wxyz
يو stuvwxyz (أين stuvwxyz هو بالضبط ثمانية أرقام سداسية عشرية) الحرف الذي قيمته السداسية العشرية هي 0x stuvwxyz
الخامس علامة تبويب عمودية ، كما في C
x هههه (أين هههه هو أي تسلسل من الأرقام السداسية العشرية) الحرف الذي تكون قيمته السداسية العشرية 0x هههه (حرف واحد بغض النظر عن عدد الأرقام السداسية العشرية المستخدمة)
الحرف الذي قيمته 0 (البايت الفارغ)
س ص (أين س ص هو بالضبط رقمان ثماني ، وليس a المرجع الخلفي) الحرف الذي تكون قيمته الثمانية 0 س ص
xyz (أين xyz هو بالضبط ثلاثة أرقام ثماني ، وليس a المرجع الخلفي) الحرف الذي تكون قيمته الثمانية 0 xyz

الأرقام السداسية العشرية هي 0 - 9 ، و a - f ، و A - F. الأرقام الثمانية هي 0-7.

عمليات الهروب من إدخال الأحرف الرقمية التي تحدد القيم خارج نطاق ASCII (0-127) لها معاني تعتمد على ترميز قاعدة البيانات. عندما يكون الترميز هو UTF-8 ، تكون قيم الهروب مكافئة لنقاط كود Unicode ، على سبيل المثال u1234 تعني الحرف U + 1234. بالنسبة إلى الترميزات متعددة البايت الأخرى ، عادةً ما تحدد عمليات تخطي إدخال الأحرف تسلسل قيم البايت للحرف. إذا كانت قيمة الهروب لا تتوافق مع أي حرف قانوني في ترميز قاعدة البيانات ، فلن يظهر أي خطأ ، ولكنه لن يتطابق أبدًا مع أي بيانات.

دائمًا ما يتم اعتبار عمليات الهروب من إدخال الأحرف كأحرف عادية. على سبيل المثال ، 135 هي] في ASCII ، لكن 135 لا تنهي تعبير القوس.

الجدول 9.21. هروب فئة التعبير العادي - الاختزال

يهرب وصف
د [[: رقم:]]
س [[:الفراغ:]]
w [[: alnum:] _] (تم تضمين الشرطة السفلية)
د [^ [: رقم:]]
س [^ [: مسافة:]]
دبليو [^ [: alnum:] _] (تم تضمين الشرطة السفلية للملاحظة)

ضمن تعبيرات الأقواس ، d ، s ، w تفقد الأقواس الخارجية ، و D ، S ، W غير قانوني. (على سبيل المثال ، [a-c d] مكافئ لـ [a-c [: digit:]]. أيضًا ، [a-c D] ، وهو ما يعادل [a-c ^ [: digit:]] ، غير قانوني.)

الجدول 9.22. هروب قيود التعبير العادي

يهرب وصف
أ يطابق فقط في بداية السلسلة (انظر القسم 9.7.3.5 لمعرفة كيف يختلف هذا عن ^)
م يطابق فقط في بداية الكلمة
م يطابق فقط في نهاية الكلمة
ذ يطابق فقط في بداية أو نهاية الكلمة
ص يطابق فقط في نقطة ليست بداية أو نهاية الكلمة
ض يطابق فقط في نهاية السلسلة (انظر القسم 9.7.3.5 لمعرفة كيف يختلف هذا عن $)

يتم تعريف الكلمة في مواصفات [[: & lt:]] و [[: & gt:]] أعلاه. هروب القيد غير قانوني داخل تعبيرات الأقواس.

الجدول 9.23. التعبير العادي رجوع المراجع

يهرب وصف
م (أين م هو رقم غير صفري) إشارة خلفية إلى م التعبير ال
مليون (أين م هو رقم غير صفري ، و nn هي بعض الأرقام الإضافية والقيمة العشرية مليون ليس أكبر من عدد أقواس الالتقاط التي شوهدت حتى الآن) إشارة خلفية إلى مليون التعبير ال

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

9.7.3.4. صياغة التعبير العادي Metasyntax

بالإضافة إلى النحو الرئيسي الموصوف أعلاه ، هناك بعض الأشكال الخاصة والمرافق النحوية المتنوعة المتاحة.

يمكن أن تبدأ RE بواحد من اثنين خاصين مدير البادئات. إذا بدأت RE بـ ***: ، فإن باقي RE يتم أخذها على أنها ARE. (لا يؤثر هذا عادةً في PostgreSQL ، نظرًا لأنه يُفترض أن تكون العناصر المتفاعلة هي AREs ولكن لها تأثير إذا تم تحديد وضع ERE أو BRE بواسطة الأعلام إلى دالة regex.) إذا بدأ RE بـ *** = ، فإن بقية RE يتم اعتبارها سلسلة حرفية ، مع اعتبار جميع الأحرف أحرفًا عادية.

يمكن أن تبدأ ARE بـ خيارات مضمنة: تسلسل (؟ xyz ) (أين xyz هو واحد أو أكثر من الأحرف الأبجدية) يحدد الخيارات التي تؤثر على بقية RE. تتجاوز هذه الخيارات أي خيارات تم تحديدها مسبقًا - على وجه الخصوص ، يمكنها تجاوز سلوك حساسية حالة الأحرف المتضمن بواسطة عامل تشغيل regex ، أو الأعلام معلمة لدالة regex. تظهر خطابات الخيار المتاحة في الجدول 9.24. لاحظ أنه يتم استخدام نفس أحرف الخيار هذه في ملف الأعلام معلمات وظائف regex.

الجدول 9.24. هي رسائل خيارات مضمنة

خيار وصف
ب بقية الطاقة المتجددة هو BRE
ج مطابقة حساسة لحالة الأحرف (تتجاوز نوع المشغل)
ه بقية الطاقة المتجددة هي ERE
أنا المطابقة غير الحساسة لحالة الأحرف (انظر القسم 9.7.3.5) (يلغي نوع المشغل)
م مرادف تاريخي ل n
ن المطابقة الحساسة للسطر الجديد (انظر القسم 9.7.3.5)
ص المطابقة الجزئية الحساسة للسطر الجديد (انظر القسم 9.7.3.5)
ف باقي RE عبارة عن سلسلة حرفية ("مقتبسة") ، وجميع الأحرف العادية
س مطابقة غير حساسة للسطر الجديد (افتراضي)
ر بناء جملة ضيق (الافتراضي انظر أدناه)
ث مطابقة عكسية جزئية حساسة للسطر الجديد ("غريبة") (انظر القسم 9.7.3.5)
x بناء الجملة الموسع (انظر أدناه)

تسري الخيارات المضمنة عند) إنهاء التسلسل. يمكن أن تظهر فقط في بداية ARE (بعد ***: المخرج إن وجد).

بالإضافة إلى المعتاد (ضيق) بناء جملة RE ، حيث تكون جميع الأحرف ذات مغزى ، يوجد موسع بناء الجملة ، متاح من خلال تحديد خيار x المضمن. في الصيغة الموسعة ، يتم تجاهل أحرف المسافات البيضاء في RE ، وكذلك جميع الأحرف بين # والسطر الجديد التالي (أو نهاية RE). هذا يسمح بالفقرات والتعليق على تعلم معقد. هناك ثلاثة استثناءات لهذه القاعدة الأساسية:

يتم الاحتفاظ بحرف المسافة البيضاء أو # يسبقه

يتم الاحتفاظ بمسافة بيضاء أو # داخل تعبير قوس

لا يمكن أن تظهر المسافة البيضاء والتعليقات ضمن الرموز متعددة الأحرف ، مثل (؟:

لهذا الغرض ، تكون أحرف المسافة البيضاء فارغة ، وعلامة تبويب ، وسطر جديد ، وأي حرف ينتمي إلى الفراغ فئة الشخصية.

أخيرًا ، في ARE ، خارج تعبيرات الأقواس ، التسلسل (؟ # ttt ) (أين ttt هو أي نص لا يحتوي على أ)) تعليق ، تم تجاهله تمامًا. مرة أخرى ، هذا غير مسموح به بين أحرف الرموز متعددة الأحرف ، مثل (؟:. مثل هذه التعليقات هي قطعة أثرية تاريخية أكثر من كونها وسيلة مفيدة ، ويتم إيقاف استخدامها باستخدام الصيغة الموسعة بدلاً من ذلك.

لا أحد من امتدادات metasyntax هذه متاحة إذا حدد *** مبدئيًا مديرًا أن مدخلات المستخدم ستُعامل كسلسلة حرفية بدلاً من RE.

9.7.3.5. قواعد مطابقة التعبير العادي

في حالة أن RE يمكن أن يتطابق مع أكثر من سلسلة فرعية واحدة من سلسلة معينة ، فإن RE تطابق السلسلة التي تبدأ في أقرب وقت في السلسلة. إذا كان RE يمكن أن يتطابق مع أكثر من سلسلة فرعية واحدة تبدأ من تلك النقطة ، فسيتم إجراء أطول تطابق ممكن أو أقصر تطابق ممكن ، اعتمادًا على ما إذا كان RE هو جشع أو غير الجشع.

يتم تحديد ما إذا كان RE هو جشع أم لا من خلال القواعد التالية:

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

إضافة أقواس حول RE لا يغير من جشعه.

ذرة كمية مع محدد كمي ثابت التكرار (< م > أو < م >؟ ) له نفس الجشع (ربما لا شيء) مثل الذرة نفسها.

ذرة كمية مع محددات كمية عادية أخرى (بما في ذلك < م , ن > مع م يساوي ن ) جشع (يفضل أطول تطابق).

ذرة كمية مع محدد كمي غير جشع (بما في ذلك < م , ن >؟ مع م يساوي ن ) غير جشع (يفضل أقصر تطابق).

فرع - أي ، RE ليس له مستوى أعلى | عامل - له نفس الجشع مثل أول ذرة محددة كميا فيها سمة الجشع.

يتكون من فرعين أو أكثر متصلين بواسطة | المشغل دائما جشع.

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

مثال على ما يعنيه هذا:

في الحالة الأولى ، يكون تعلم المخاطر ككل جشعًا لأن Y * جشع. يمكن أن تتطابق مع البداية من Y ، وتتطابق مع أطول سلسلة ممكنة تبدأ من هناك ، على سبيل المثال ، Y123. الإخراج هو الجزء بين قوسين من ذلك ، أو 123. في الحالة الثانية ، فإن RE ككل غير جشع لأن Y *؟ غير جشع. يمكن أن تتطابق مع البداية من Y ، وتتطابق مع أقصر سلسلة ممكنة تبدأ من هناك ، أي Y1. التعبير الفرعي [0-9] <1،3> جشع لكنه لا يمكنه تغيير القرار فيما يتعلق بطول المباراة الإجمالي ، لذا فهو مضطر لمطابقة 1 فقط.

باختصار ، عندما تحتوي RE على كلٍ من التعبيرات الجزئية الجشعة وغير الجشعة ، يكون إجمالي طول المطابقة إما أطول وقت ممكن أو قصير قدر الإمكان ، وفقًا للسمة المخصصة لـ RE بالكامل. تؤثر السمات المخصصة للتعبيرات الفرعية فقط على مقدار التطابق المسموح لهم "بتناوله" بالنسبة لبعضهم البعض.

المحددات الكمية <1،1> و <1،1>؟ يمكن استخدامها لإجبار الجشع أو عدم الجشع ، على التوالي ، على تعبير ثانوي أو على RE كامل. يكون هذا مفيدًا عندما تحتاج إلى أن تتمتع الطاقة المتجددة بأكملها بخاصية جشع تختلف عما يتم استنتاجه من عناصرها. كمثال ، افترض أننا نحاول فصل سلسلة تحتوي على بعض الأرقام في الأرقام والأجزاء التي تسبقها وبعدها. قد نحاول القيام بذلك على النحو التالي:

لم ينجح ذلك: الأول. * جشع لذا "يأكل" بقدر ما يستطيع ، تاركًا d + لتتطابق في آخر مكان ممكن ، آخر رقم. قد نحاول إصلاح ذلك بجعله غير جشع:

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

يتيح التحكم في الجشع الشامل للطاقة المتجددة بشكل منفصل عن جشع مكوناته مرونة كبيرة في التعامل مع أنماط متغيرة الطول.

عند تحديد التطابق الأطول أو الأقصر ، يتم قياس أطوال المطابقة بالأحرف ، وليس بالعناصر المجمعة. تعتبر السلسلة الفارغة أطول من عدم وجود تطابق على الإطلاق. على سبيل المثال: تتطابق bb * مع الأحرف الوسطى الثلاثة من abbbc (week | Wee) (night | knights) تطابق جميع الأحرف العشرة في ليالي الأسبوع عندما (. *). * مطابقة مع abc ، يتطابق التعبير الفرعي بين الأقواس مع جميع الأحرف الثلاثة وعندما (a *) * تتم مطابقة bc مع كل من RE بالكامل والتعبير الفرعي المحصور بين قوسين يتطابقان مع سلسلة فارغة.

إذا تم تحديد المطابقة المستقلة عن حالة الأحرف ، فسيكون التأثير إلى حد كبير كما لو أن جميع الفروق بين الأحرف قد اختفت من الأبجدية. عندما يظهر حرف أبجدي موجود في حالات متعددة كحرف عادي خارج تعبير القوس ، فإنه يتحول بشكل فعال إلى تعبير قوس يحتوي على كلتا الحالتين ، على سبيل المثال ، يصبح x [xX]. عندما يظهر داخل تعبير قوس ، تتم إضافة جميع نظائر الحالة له إلى تعبير القوس ، على سبيل المثال ، [x] يصبح [xX] و [^ x] يصبح [^ xX].

إذا تم تحديد مطابقة حساسة للسطر الجديد ،. وتعبيرات الأقواس التي تستخدم ^ لن تتطابق أبدًا مع حرف السطر الجديد (لذلك لن تتخطى المطابقات أبدًا الأسطر الجديدة ما لم يرتبها RE بشكل صريح) وسيطابق ^ و $ السلسلة الفارغة بعد السطر الجديد وقبله على التوالي ، بالإضافة إلى المطابقة في البداية والنهاية من السلسلة على التوالي. ولكن تستمر ARE escapes A و Z في مطابقة بداية السلسلة النصية أو نهايتها فقط .

إذا تم تحديد المطابقة الجزئية الحساسة للسطر الجديد ، فسيؤثر ذلك. وتعبيرات الأقواس كما هو الحال مع المطابقة الحساسة للسطر الجديد ، ولكن ليس ^ و $.

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

9.7.3.6. الحدود والتوافق

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

الميزة الوحيدة لـ AREs التي لا تتوافق فعليًا مع POSIX EREs هي أنها لا تفقد أهميتها الخاصة داخل تعبيرات الأقواس. تستخدم جميع ميزات ARE الأخرى صياغة غير قانونية أو لها تأثيرات غير محددة أو غير محددة في POSIX EREs ، كما أن بناء جملة المخرجين خارج نطاق POSIX لكل من BREs و EREs.

تم استعارة العديد من امتدادات ARE من Perl ، ولكن تم تغيير بعضها لتنظيفها ، وبعض ملحقات Perl غير موجودة. تشمل حالات عدم التوافق في الملاحظة b ، B ، وعدم وجود معاملة خاصة لسطر جديد لاحق ، وإضافة تعبيرات الأقواس المكملة للأشياء المتأثرة بالمطابقة الحساسة للسطر الجديد ، والقيود المفروضة على الأقواس والمراجع الخلفية في قيود lookahead / lookbehind ، و أطول / أقصر تطابق (بدلاً من المباراة الأولى) دلالات مطابقة.

يوجد نوعان من عدم التوافق المهمين بين AREs وبناء جملة ERE المعترف به في إصدارات ما قبل 7.4 من PostgreSQL:

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

في AREs ، يبقى حرفًا خاصًا داخل [] ، لذلك يجب كتابة داخل تعبير قوس .

9.7.3.7. التعبيرات العادية الأساسية

تختلف BREs عن EREs في عدة جوانب. في BREs ، | و + و و؟ هي شخصيات عادية ولا يوجد مكافئ لوظائفها. محددات الحدود هي <و > ، مع <و> بحد ذاتها أحرف عادية. أقواس التعبيرات الفرعية المتداخلة هي (و ) ، مع (و) بحد ذاتها أحرف عادية. ^ هو حرف عادي ما عدا في بداية RE أو بداية التعبير الفرعي بين قوسين ، $ هو حرف عادي ما عدا في نهاية RE أو نهاية التعبير الفرعي بين قوسين ، و * هو حرف عادي إذا ظهر في بداية RE أو بداية تعبير فرعي بين قوسين (بعد بادئة محتملة ^). أخيرًا ، تتوفر المراجع السابقة المكونة من رقم واحد ، و & lt و & gt مرادفان لـ [[: & lt:]] و [[: & gt:]] على التوالي ، لا تتوفر عمليات تجاوز أخرى في BREs.

9.7.3.8. الاختلافات عن XQuery (LIKE_REGEX)

منذ SQL: 2008 ، يتضمن معيار SQL عامل تشغيل LIKE_REGEX الذي يقوم بتنفيذ مطابقة الأنماط وفقًا لمعيار التعبير العادي XQuery. لم تنفذ PostgreSQL هذا المعامل بعد ، ولكن يمكنك الحصول على سلوك مشابه جدًا باستخدام دالة regexp_match () ، نظرًا لأن تعبيرات XQuery العادية قريبة جدًا من بناء جملة ARE الموضح أعلاه.

تشمل الاختلافات الملحوظة بين ميزة التعبير العادي القائمة على POSIX والتعبيرات العادية XQuery ما يلي:

لا يتم دعم طرح فئة حرف XQuery. مثال على هذه الميزة هو استخدام ما يلي لمطابقة الحروف الساكنة الإنجليزية فقط: [a-z- [aeiou]].

اختصارات فئة أحرف XQuery c و C و i و I غير معتمدة.

عناصر فئة حرف XQuery باستخدام p أو معكوس P غير مدعومة.

يفسر POSIX فئات الأحرف مثل w (انظر الجدول 9.21) وفقًا للإعدادات المحلية السائدة (والتي يمكنك التحكم فيها عن طريق إرفاق جملة COLLATE بالمشغل أو الوظيفة). يحدد XQuery هذه الفئات بالرجوع إلى خصائص أحرف Unicode ، لذلك لا يتم الحصول على السلوك المكافئ إلا من خلال الإعدادات المحلية التي تتبع قواعد Unicode.

يحاول معيار SQL (وليس XQuery نفسه) تلبية المزيد من المتغيرات من "السطر الجديد" مما يفعله POSIX. تعتبر خيارات المطابقة الجديدة الحساسة للسطر الموضحة أعلاه فقط ASCII NL ( n) سطرًا جديدًا ، ولكن SQL ستجعلنا نتعامل مع CR ( r) و CRLF ( r n) (سطر جديد بنمط Windows) ، وبعض أحرف Unicode فقط مثل LINE SEPARATOR (U + 2028) كأسطر جديدة أيضًا. على وجه الخصوص. و s يجب أن يحسب r n على أنه حرف واحد وليس حرفين وفقًا لـ SQL.

من بين عمليات تخطي إدخال الأحرف الموضحة في الجدول 9.20 ، يدعم XQuery n و r و t فقط.

لا يدعم XQuery [: اسم :] بناء الجملة لفئات الأحرف داخل تعبيرات الأقواس.

لا يحتوي XQuery على قيود lookahead أو lookbehind ، ولا أي من عمليات هروب القيد الموضحة في الجدول 9.22.

لا توجد نماذج بناء الجملة الموصوفة في القسم 9.7.3.4 في XQuery.

ترتبط أحرف علامة التعبير العادي المحددة بواسطة XQuery بأحرف الخيار الخاصة بـ POSIX ولكنها لا تشبهها (الجدول 9.24). بينما يعمل الخياران i و q بالطريقة نفسها ، لا يقوم الآخرون بما يلي:

توفر علامتا XQuery (السماح للنقطة بمطابقة السطر الجديد) و m (السماح ^ و $ بالمطابقة في الأسطر الجديدة) الوصول إلى نفس السلوكيات مثل علامات POSIX n و p و w ، ولكنها تفعل ذلك ليس تطابق سلوك علامتي POSIX s و m. لاحظ على وجه الخصوص أن dot-match-newline هو السلوك الافتراضي في POSIX وليس XQuery.

تختلف علامة X (تجاهل المسافة البيضاء في النمط) الخاصة بـ XQuery بشكل ملحوظ عن علامة الوضع الموسع في POSIX. تسمح علامة x الخاصة بـ POSIX أيضًا ببدء تعليق في النمط ، ولن يتجاهل POSIX حرف المسافة البيضاء بعد الشرطة المائلة للخلف.


5 إجابات 5

إذا كان لديك GNU sed (أي Linux أو Cygwin غير مضمن):

إذا كان لديك شريط في سطرين متتاليين ، فسيؤدي ذلك إلى حذف السطر الثاني دون تحليله. على سبيل المثال ، إذا كان لديك شريط ملف / شريط / foo مكون من 3 أسطر ، فسيظل سطر foo.

في حالة ظهور شريط في سطور متتالية ، يمكنك القيام بما يلي:

والتي يمكن تعديلها لحذف أكثر من سطرين عن طريق تغيير 2 أعلاه مع عدد الأسطر المراد حذفها بما في ذلك السطر المطابق.

إذا لم يكن الأمر كذلك ، فمن السهل القيام به في sed باستخدام حلMichaelRollins أو:

أنا لا أتقن لغة sed ، لكن من السهل فعل ذلك في awk:

يقرأ البرنامج النصي awk: بالنسبة إلى السطر الذي يحتوي على شريط ، احصل على السطر التالي (getline) ، ثم تخطي جميع عمليات المعالجة اللاحقة (التالية). يطبع النمط 1 في النهاية الأسطر المتبقية.

تحديث

كما هو موضح في التعليق ، لم يعمل الحل أعلاه مع شريط متتالي. إليك حل مُعدّل يأخذ في الاعتبار:

نواصل القراءة الآن لتخطي جميع / bar / الأسطر.

سترغب في الاستفادة من إمكانيات البرمجة النصية في sed لتحقيق ذلك.

يقوم الأمر "N" بإلحاق السطر التالي من الإدخال في مساحة النمط. هذا مقترنًا بالخط من تطابق النمط (/ bar /) سيكون الأسطر التي ترغب في حذفها. يمكنك بعد ذلك الحذف بشكل طبيعي باستخدام الأمر "d".

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

يتم تنفيذه بما يكفي ببساطة - ولكن عليك أن تنظر إلى ما وراءك قليلاً.

إنه يعمل عن طريق تبديل مسافات الانتظار والنمط لكل سطر تمت قراءته - بحيث يمكن مقارنة السطر الأخير بالتيار في كل مرة. لذلك عندما يقرأ sed سطراً فإنه يتبادل محتويات مخازنه المؤقتة - والسطر السابق يكون حينئذٍ محتويات مخزن التحرير المؤقت الخاص به ، بينما يتم وضع السطر الحالي في مساحة الانتظار.

لذا يتحقق sed من السطر السابق لمطابقة مباراة ، وإذا كان! لم يتم العثور على التعبيرين في <وظيفة> يتم تشغيلهما. ستعمل sed على إضافة مساحة الانتظار عن طريق الكتابة فوق مساحة النمط - مما يعني أن الخط الحالي موجود بعد ذلك في فضاءات الانتظار والنمط - وبعد ذلك ستتحقق من وجود تطابق مع أحدث تعبير عادي تم تجميعه - مباراة - و إذا هو - هي لا مباراة طبع ع.

هذا يعني أن السطر تتم طباعته فقط إذا لم يتم ذلك مباراة و السطر السابق مباشرة لا مباراة . كما أنه يمنع أي مقايضات غير ضرورية لتسلسلات مباراة إس.

إذا كنت تريد إصدارًا يمكن أن يسقط عددًا عشوائيًا من الأسطر التي تحدث بعد ملف مباراة سيحتاج إلى مزيد من العمل:

. استبدل 5 بعدد الأسطر (بما في ذلك السطر المتطابق) التي ترغب في إزالتها.


التشفير الآمن في C و C ++: السلاسل وتدفقات المخزن المؤقت

إذا كانت هناك قاعدة صارمة وسريعة للبرمجة الآمنة في C و C ++ ، فستكون هذه: يحصل على() وظيفة. ال يحصل على() تم استخدام الوظيفة على نطاق واسع في أمثلة البرامج الضعيفة في هذا الكتاب. ال يحصل على() تقرأ الوظيفة سطرًا من الإدخال القياسي إلى المخزن المؤقت حتى يتم العثور على سطر جديد أو نهاية الملف (EOF). لم يتم التحقق من تجاوز سعة المخزن المؤقت. الاقتباس التالي مأخوذ من صفحة دليل الوظيفة:

    لم أستعمل أبدا يحصل على(). لأنه من المستحيل معرفة عدد الأحرف دون معرفة البيانات مسبقًا يحصل على() سوف تقرأ ، ولأن يحصل على() ستستمر في تخزين الأحرف بعد نهاية المخزن المؤقت ، فمن الخطورة للغاية استخدامها. تم استخدامه لكسر أمن الكمبيوتر.

كما سبق ذكره ، فإن يحصل على() تم إهمال الوظيفة في ISO / IEC 9899: TC3 وإزالتها من C11.

هناك خياران لتطبيق متوافق تمامًا مع C99 هما الاستبدال يحصل على() مع أي منهما fgets () أو getchar ().

المعيار C fgets () الوظيفة لها سلوك مشابه لـ يحصل على(). ال fgets () تقبل الدالة وسيطين إضافيين: عدد الأحرف المراد قراءتها وتدفق الإدخال. متي ستدين تم تحديده على أنه تيار ، fgets () يمكن استخدامها لمحاكاة سلوك يحصل على().

جزء البرنامج في المثال 2.9 يقرأ سطرًا نصيًا من ستدين باستخدام fgets () وظيفة.

المثال 2.9. القراءة من stdin باستخدام fgets ()

على عكس يحصل على()، ال fgets () تحتفظ الوظيفة بحرف السطر الجديد ، مما يعني أنه لا يمكن استخدام الوظيفة كبديل مباشر لـ يحصل على().

عند استخدام fgets ()، من الممكن قراءة سطر جزئي. يمكن الكشف عن اقتطاع مدخلات المستخدم لأن المخزن المؤقت للإدخال لن يحتوي على حرف سطر جديد.

ال fgets () تقرأ الدالة ، على الأكثر ، واحدًا أقل من عدد الأحرف المحدد من الدفق في المصفوفة. لا تتم قراءة أي أحرف إضافية بعد حرف سطر جديد أو EOF. تتم كتابة حرف فارغ مباشرة بعد قراءة الحرف الأخير في المصفوفة.

من الممكن استخدام fgets () لمعالجة خطوط الإدخال الطويلة جدًا بحيث لا يمكن تخزينها في المصفوفة الوجهة بأمان ، ولكن لا يوصى بذلك لأسباب تتعلق بالأداء. ال fgets () يمكن أن تؤدي الوظيفة إلى تجاوز سعة المخزن المؤقت إذا تجاوز العدد المحدد من الأحرف المراد إدخالها طول المخزن المؤقت للوجهة.

البديل الثاني لاستبدال يحصل على() الوظيفة في تطبيق متوافق تمامًا مع C99 هو استخدام getchar () وظيفة. ال getchar () تُرجع الدالة الحرف التالي من تدفق الإدخال المشار إليه ستدين. إذا كان الدفق في EOF ، فسيتم ضبط مؤشر EOF للتدفق و getchar () عائدات EOF. في حالة حدوث خطأ في القراءة ، يتم تعيين مؤشر الخطأ للدفق و getchar () عائدات EOF. جزء البرنامج في المثال 2.10 يقرأ سطرًا نصيًا من ستدين باستخدام getchar () وظيفة.

المثال 2.10. القراءة من stdin باستخدام getchar ()

إذا كان في نهاية الحلقة feof (ستدين)! = 0، فقد قرأت الحلقة حتى نهاية الملف دون مواجهة حرف سطر جديد. إذا كان في نهاية الحلقة خطأ (ستدين)! = 0، حدث خطأ في القراءة قبل أن تصادف الحلقة حرف سطر جديد. إذا كان في نهاية الحلقة chars_read & # 62 index، تم قطع سلسلة الإدخال. معيار التشفير الآمن CERT C [Seacord 2008] ، & # 8220FIO34-C. يستخدم int لالتقاط القيمة المرجعة لوظائف الإدخال / الإخراج الخاصة بالحرف ، يتم تطبيق & # 8221 أيضًا في هذا الحل.

باستخدام getchar () يمكن أن تؤدي وظيفة القراءة في سطر ما إلى تجاوز سعة المخزن المؤقت إذا لم يتم تقييد عمليات الكتابة إلى المخزن المؤقت بشكل صحيح.

توفر قراءة حرف واحد في كل مرة مزيدًا من المرونة في التحكم في السلوك دون زيادة في الأداء. الاختبار التالي لـ في حين عادة ما تكون الحلقة كافية:

while (((ch = getchar ())! = ' n') & # 38 & # 38 ch! = EOF)

يرى معيار التشفير الآمن CERT C [Seacord 2008] ، & # 8220FIO35-C. يستخدم feof () و خطأ () لاكتشاف أخطاء نهاية الملف والملف عندما sizeof (int) == sizeof (char)، & # 8221 للحالة حيث feof () و خطأ () يجب أن تستخدم بدلا من ذلك.

C11 Annex K واجهات فحص الحدود: gets_s ()

سي 11 يحصل على () الوظيفة هي إصدار متوافق ولكنه أكثر أمانًا من يحصل على(). ال يحصل على () الوظيفة هي بديل أقرب عن يحصل على() وظيفة من fgets () من حيث أنه يقرأ فقط من الدفق المشار إليه بواسطة ستدين ولا يحتفظ بحرف السطر الجديد. ال يحصل على () تقبل الدالة وسيطة إضافية ، rsize_t، التي تحدد الحد الأقصى لعدد الأحرف المطلوب إدخالها. تحدث حالة خطأ إذا كانت هذه الوسيطة تساوي صفرًا أو أكبر من RSIZE_MAX أو إذا كان المؤشر إلى صفيف حرف الوجهة هو باطل. في حالة حدوث حالة خطأ ، لا يتم تنفيذ أي إدخال ولا يتم تعديل صفيف الأحرف. وإلا فإن يحصل على () تقرأ الدالة ، على الأكثر ، حرفًا واحدًا أقل من عدد الأحرف المحدد ، ويتم كتابة حرف فارغ مباشرةً بعد قراءة الحرف الأخير في المصفوفة. جزء البرنامج الموضح في المثال 2.11 يقرأ سطرًا نصيًا من ستدين باستخدام يحصل على () وظيفة.

المثال 2.11. القراءة من stdin باستخدام gets_s ()

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

ال يحصل على () تنجح الوظيفة فقط إذا كانت تقرأ سطرًا كاملاً (أي أنها تقرأ حرف سطر جديد). إذا تعذرت قراءة سطر كامل ، ترجع الدالة باطل، يعين المخزن المؤقت على السلسلة الخالية ، ويمسح دفق الإدخال إلى حرف السطر الجديد التالي.

ال يحصل على () لا يزال من الممكن أن تؤدي الوظيفة إلى تجاوز سعة المخزن المؤقت إذا تجاوز العدد المحدد من الأحرف المراد إدخالها طول المخزن المؤقت للوجهة.

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

وظائف التخصيص الديناميكي

تصف المواصفة القياسية ISO / IEC TR 24731-2 الحصول على خط() وظيفة مشتقة من POSIX. سلوك الحصول على خط() وظيفة مشابهة لوظيفة fgets () ولكنه يقدم العديد من الميزات الإضافية. أولاً ، إذا كان سطر الإدخال طويلاً جدًا ، بدلاً من اقتطاع المدخلات ، تقوم الوظيفة بتغيير حجم المخزن المؤقت باستخدام realloc (). ثانيًا ، في حالة نجاحه ، يقوم بإرجاع عدد الأحرف المقروءة ، وهو أمر مفيد في تحديد ما إذا كان الإدخال يحتوي على أي أحرف فارغة قبل السطر الجديد. ال الحصول على خط() تعمل الوظيفة فقط مع المخازن المؤقتة المخصصة مع مالوك (). إذا مرر مؤشر فارغ ، الحصول على خط() يخصص مخزنًا مؤقتًا بحجم كافٍ لاحتواء الإدخال. على هذا النحو ، يجب على المستخدم صراحة مجانا() المخزن المؤقت في وقت لاحق. ال الحصول على خط() الوظيفة تعادل getdelim () وظيفة (محددة أيضًا في ISO / IEC TR 24731-2) بحرف محدد يساوي حرف السطر الجديد. جزء البرنامج الموضح في المثال 2.12 يقرأ سطرًا نصيًا من ستدين باستخدام الحصول على خط() وظيفة.

المثال 2.12. القراءة من stdin باستخدام getline ()

ال الحصول على خط() تُرجع الدالة عدد الأحرف المكتوبة في المخزن المؤقت ، بما في ذلك حرف السطر الجديد إذا تمت مصادفته قبل نهاية الملف. في حالة حدوث خطأ في القراءة ، يتم تعيين مؤشر الخطأ للدفق و الحصول على خط() إرجاع & # 82111. وبالتالي ، فإن تصميم هذه الوظيفة ينتهك معيار التشفير الآمن CERT C [Seacord 2008] ، & # 8220ERR02-C. تجنب مؤشرات الخطأ في النطاق ، & # 8221 كما يتضح من استخدام ssize_t النوع الذي تم إنشاؤه لغرض توفير مؤشرات خطأ داخل النطاق.

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

يلخص الجدول 2.4 بعض الوظائف البديلة لـ يحصل على() الموضحة في هذا القسم. يمكن استخدام كل هذه الوظائف بشكل آمن.

الجدول 2.4. وظائف بديلة للحصول على ()

يحتفظ بالحرف الجديد

يخصص الذاكرة ديناميكيًا

Strcpy () و strcat ()

ال strcpy () و سترات () الدوال هي مصادر متكررة لتدفق المخزن المؤقت لأنها لا تسمح للمتصل بتحديد حجم مصفوفة الوجهة ، وتوصي العديد من استراتيجيات المنع بمتغيرات أكثر أمانًا لهذه الوظائف.

ليس كل استخدامات strcpy () معيبة. على سبيل المثال ، غالبًا ما يكون من الممكن تخصيص المساحة المطلوبة ديناميكيًا ، كما هو موضح في المثال 2.13.

المثال 2.13. ديناميكي تخصيص المساحة المطلوبة

لكي يكون هذا الرمز آمنًا ، يجب التحقق من صحة سلسلة المصدر بالكامل [Wheeler 2004] ، على سبيل المثال ، للتأكد من أن السلسلة ليست طويلة جدًا. في بعض الحالات ، من الواضح أنه لا توجد إمكانية للكتابة خارج حدود المصفوفة. نتيجة لذلك ، قد لا يكون استبدال كل مكالمة إلى أو تأمينها بطريقة أخرى فعالاً من حيث التكلفة strcpy (). في حالات أخرى ، قد يكون من المستحسن استبدال strcpy () تعمل من خلال استدعاء وظيفة بديلة أكثر أمانًا للتخلص من رسائل التشخيص التي تم إنشاؤها بواسطة المجمعين أو أدوات التحليل.

المعيار C strncpy () كثيرا ما يوصى بوظيفة كبديل ل strcpy () وظيفة. لسوء الحظ، strncpy () عرضة لأخطاء الإنهاء الصفري ومشاكل أخرى ، وبالتالي لا تعتبر بديلاً آمنًا لـ strcpy ().

OpenBSD

ال strlcpy () و strlcat () ظهرت الوظائف لأول مرة في OpenBSD 2.4. تنسخ هذه الوظائف وتسلسل السلاسل بطريقة أقل عرضة للخطأ من وظائف C القياسية المقابلة. هذه الوظائف والنماذج # 8217 هي كما يلي:

ال strlcpy () تقوم الدالة بنسخ السلسلة المنتهية بقيمة خالية من src ل dst (يصل إلى بحجم الشخصيات). ال strlcat () دالة تلحق السلسلة المنتهية بقيمة خالية src حتى نهاية dst (لكن ليس أكثر من بحجم ستكون الأحرف في الوجهة).

للمساعدة في منع الكتابة خارج حدود المصفوفة ، فإن ملف strlcpy () و strlcat () تقبل الدالات الحجم الكامل لسلسلة الوجهة كمعامل حجم.

تضمن كلتا الوظيفتين أن السلسلة الوجهة منتهية بقيمة خالية من أجل كافة المخازن المؤقتة ذات الطول غير الصفري.

ال strlcpy () و strlcat () تعيد الدوال الطول الإجمالي للسلسلة التي حاولت إنشاءها. إلى عن على strlcpy ()، هذا هو طول المصدر لـ strlcat ()، هو طول الوجهة (قبل التسلسل) بالإضافة إلى طول المصدر. للتحقق من وجود اقتطاع ، يجب على المبرمج التحقق من أن القيمة المرجعة أقل من معلمة الحجم. إذا تم قطع السلسلة الناتجة ، فإن المبرمج لديه الآن عدد البايتات اللازمة لتخزين السلسلة بأكملها ويمكن إعادة تخصيصها وإعادة نسخها.

لا هذا ولا ذاك strlcpy () ولا strlcat () يملأ الصفر سلسلة الوجهة الخاصة به (بخلاف البايت الفارغ الإلزامي لإنهاء السلسلة). والنتيجة هي أداء قريب من strcpy () وأفضل بكثير من strncpy ().

C11 Annex K واجهات فحص الحدود

ال strcpy_s () و strcat_s () يتم تعريف الوظائف في الملحق C11 الملحق K كوظائف بديلة قريبة لـ strcpy () و سترات (). ال strcpy_s () وظيفة لها معلمة إضافية تعطي حجم مصفوفة الوجهة لمنع تجاوز المخزن المؤقت:

ال strcpy_s () وظيفة مشابهة ل strcpy () في حالة عدم وجود انتهاكات للقيد. ال strcpy_s () تقوم الدالة بنسخ الأحرف من سلسلة المصدر إلى مصفوفة أحرف الوجهة بما في ذلك الحرف الفارغ المنتهي.

ال strcpy_s () تنجح الوظيفة فقط عندما يمكن نسخ سلسلة المصدر بالكامل إلى الوجهة دون تجاوز المخزن المؤقت للوجهة. ترجع الدالة 0 عند النجاح ، مما يعني أن جميع الأحرف المطلوبة من السلسلة المشار إليها بواسطة s2 تتلاءم مع المصفوفة المشار إليها بواسطة ق 1 وأن النتيجة في ق 1 منتهية بقيمة خالية. وبخلاف ذلك ، يتم إرجاع قيمة غير صفرية.

ال strcpy_s () تفرض الدالة مجموعة متنوعة من قيود وقت التشغيل. يحدث خطأ قيد التشغيل في حالة حدوث أي منهما ق 1 أو s2 هو مؤشر فارغ إذا كان الحد الأقصى لطول المخزن المؤقت للوجهة يساوي صفرًا ، أكبر من RSIZE_MAX، أو أقل من أو يساوي طول سلسلة المصدر أو إذا حدث النسخ بين كائنات متداخلة. يتم تعيين سلسلة الوجهة على سلسلة فارغة ، وتقوم الدالة بإرجاع قيمة غير صفرية لزيادة رؤية المشكلة.

يوضح المثال 2.15 تنفيذ Open Watcom لـ strcpy_s () وظيفة. تتبع عمليات التحقق من أخطاء وقت التشغيل والقيود بالتعليقات.

المثال 2.14. افتح تطبيق Watcom لوظيفة strcpy_s ()

ال strcat_s () تلحق الدالة أحرف السلسلة المصدر ، بما في ذلك الحرف الفارغ ، بنهاية سلسلة الوجهة. يحل الحرف الأولي من السلسلة المصدر محل الحرف الفارغ في نهاية سلسلة الوجهة.

ال strcat_s () ترجع الدالة 0 عند النجاح. ومع ذلك ، يتم تعيين سلسلة الوجهة على سلسلة فارغة ويتم إرجاع قيمة غير صفرية إذا كان مؤشر المصدر أو الوجهة باطل أو إذا كان الحد الأقصى لطول المخزن المؤقت الوجهة يساوي 0 أو أكبر من RSIZE_MAX. ال strcat_s () ستفشل الوظيفة أيضًا إذا كانت سلسلة الوجهة ممتلئة بالفعل أو إذا لم تكن هناك مساحة كافية لإلحاق سلسلة المصدر بالكامل.

ال strcpy_s () و strcat_s () لا يزال من الممكن أن تؤدي الوظائف إلى تجاوز سعة المخزن المؤقت إذا تم تحديد الحد الأقصى لطول المخزن المؤقت الوجهة بشكل غير صحيح.

وظائف التخصيص الديناميكي

تصف ISO / IEC TR 24731-2 [ISO / IEC TR 24731-2: 2010] POSIX strdup () وظيفة ، والتي يمكن استخدامها أيضًا لنسخ سلسلة. لا تحدد المواصفة ISO / IEC TR 24731-2 أي وظائف بديلة لـ سترات (). ال strdup () تقبل الدالة مؤشرًا إلى سلسلة وتعيد مؤشرًا إلى سلسلة مكررة مخصصة حديثًا. يجب استعادة هذه الذاكرة بتمرير المؤشر الذي تم إرجاعه إلى مجانا().

بدائل الملخص

يلخص الجدول 2.5 بعض الوظائف البديلة لنسخ السلاسل الموضحة في هذا القسم.

الجدول 2.5. وظائف نسخ السلسلة

حماية تجاوز سعة المخزن المؤقت

ضمانات الإنهاء الباطل

قد يقطع السلسلة

يخصص الذاكرة الديناميكية

يلخص الجدول 2.6 بعض الوظائف البديلة لـ سترات () الموضحة في هذا القسم. لا يحدد TR 24731-2 وظيفة بديلة لـ سترات ().

الجدول 2.6. وظائف سلسلة السلاسل

حماية تجاوز سعة المخزن المؤقت

ضمانات الإنهاء الباطل

قد يقطع السلسلة

يخصص الذاكرة الديناميكية

Strncpy () و strncat ()

ال strncpy () و strncat () وظائف مماثلة ل strcpy () و سترات () وظائف ، ولكن لكل منها ملف size_t معامل ن هذا يحد من عدد الأحرف المراد نسخها. يمكن اعتبار هذه الوظائف على أنها وظائف مقتطعة للنسخ والتسلسل.

ال strncpy () تؤدي وظيفة المكتبة وظيفة مماثلة لـ strcpy () لكنه يسمح بحجم أقصى ن لتكون محدد:

ال strncpy () يمكن استخدام الوظيفة كما هو موضح في المثال التالي:

بسبب ال strncpy () الوظيفة غير مضمونة لإنهاء السلسلة الوجهة بقيمة خالية ، يجب أن يكون المبرمج حريصًا على التأكد من أن السلسلة الوجهة تم إنهاؤها فارغة بشكل صحيح دون الكتابة فوق الحرف الأخير.

المعيار C strncpy () يوصى كثيرًا بوظيفة & # 8220 أكثر أمانًا & # 8221 بديلاً عن strcpy (). ومع ذلك، strncpy () عرضة لأخطاء إنهاء السلسلة ، كما هو مفصل قريبًا في & # 8220C11 Annex K Bounds-Checking Interfaces. & # 8221

ال strncat () الوظيفة لديها التوقيع التالي:

ال strncat () وظيفة لا تلحق أكثر من ن الأحرف (لا يتم إلحاق حرف فارغ والأحرف التي تليها) من المصفوفة المشار إليها بواسطة s2 إلى نهاية السلسلة المشار إليها بـ ق 1. الطابع الأولي لـ s2 للكتابة فوق الحرف الفارغ في نهاية ق 1. يتم دائمًا إلحاق حرف فارغ للنتيجة. وبالتالي ، فإن الحد الأقصى لعدد الأحرف التي يمكن أن ينتهي بها الأمر في المصفوفة يشير إليه ق 1 يكون strlen (s1) + n + 1.

ال strncpy () و strncat () يجب استخدام الوظائف بحذر ، أو يجب عدم استخدامها على الإطلاق ، لا سيما مع توفر بدائل أقل عرضة للخطأ. فيما يلي مثال على رمز فعلي ناتج عن تحويل مبسط للتعليمات البرمجية الموجودة من strcpy () و سترات () ل strncpy () و strncat ():

المشكلة هي أن الحجة الأخيرة ل strncat () يجب ألا يكون إجمالي طول المخزن المؤقت ، بل يجب أن يكون المساحة المتبقية بعد الاستدعاء strncpy (). تتطلب كلتا الوظيفتين تحديد المساحة المتبقية وليس الحجم الإجمالي للمخزن المؤقت. نظرًا لأن المساحة المتبقية تتغير في كل مرة تتم فيها إضافة البيانات أو إزالتها ، يجب على المبرمجين تتبع المساحة المتبقية أو إعادة حسابها باستمرار. هذه العمليات عرضة للخطأ ويمكن أن تؤدي إلى نقاط الضعف. الاستدعاء التالي يحسب المساحة المتبقية بشكل صحيح عند ربط سلسلة باستخدام strncat ():

strncat (dest ، مصدر ، dest_size-strlen (dest) -1)

مشكلة أخرى في استخدام strncpy () و strncat () كبدائل ل strcpy () و سترات () الدالات هي أن أيا من الوظائف السابقة لا توفر رمز حالة أو تقارير عندما يتم قطع السلسلة الناتجة. تعيد كلتا الوظيفتين مؤشرًا إلى المخزن المؤقت للوجهة ، مما يتطلب جهدًا كبيرًا من قبل المبرمج لتحديد ما إذا كانت السلسلة الناتجة قد تم اقتطاعها.

هناك أيضًا مشكلة في الأداء مع strncpy () من حيث أنه يملأ المخزن المؤقت الوجهة بالكامل بالبايتات الفارغة بعد استنفاد بيانات المصدر. على الرغم من عدم وجود سبب وجيه لهذا السلوك ، إلا أن العديد من البرامج تعتمد عليه الآن ، ونتيجة لذلك ، من الصعب تغييره.

ال strncpy () و strncat () تؤدي الوظائف دورًا خارج نطاق استخدامها كوظائف بديلة لـ strcpy () و سترات (). كان الغرض الأصلي من هذه الوظائف هو السماح بنسخ سلسلة فرعية وتسلسلها. ومع ذلك ، فإن هذه الوظائف عرضة لتجاوز سعة المخزن المؤقت وأخطاء إنهاء القيمة الصفرية.

C11 Annex K واجهات فحص الحدود

يحدد الملحق C11 الملحق K ملف strncpy_s () و strncat_s () تعمل كبدائل قريبة لـ strncpy () و strncat ().

ال strncpy_s () لا يزيد عدد نسخ الدالة عن عدد محدد من الأحرف المتتالية (لا يتم نسخ الأحرف التي تلي حرفًا فارغًا) من سلسلة مصدر إلى مصفوفة أحرف الوجهة. ال strncpy_s () الوظيفة لديها التوقيع التالي:

ال strncpy_s () وظيفة لها معلمة إضافية تعطي حجم مصفوفة الوجهة لمنع تجاوز المخزن المؤقت. في حالة حدوث انتهاك لقيد وقت التشغيل ، يتم تعيين مصفوفة الوجهة على السلسلة الفارغة لزيادة رؤية المشكلة.

ال strncpy_s () تتوقف الدالة عن نسخ السلسلة المصدر إلى المصفوفة الوجهة عند حدوث أحد الشرطين التاليين:

  1. يتم نسخ الحرف الفارغ الذي ينهي سلسلة المصدر إلى الوجهة.
  2. عدد الأحرف المحدد بواسطة ن تم نسخ الحجة.

يتم توفير النتيجة في الوجهة مع حرف إنهاء فارغ إذا لم يتم نسخ أحدها من المصدر. يجب احتواء النتيجة ، بما في ذلك حرف النهاية الصفري ، مع الوجهة ، أو حدوث انتهاك لقيد وقت التشغيل. التخزين خارج صفيف الوجهة لا يتم تعديله أبدًا.

ال strncpy_s () ترجع الدالة 0 للإشارة إلى النجاح. إذا كانت وسيطات الإدخال غير صالحة ، فإنها ترجع قيمة غير صفرية وتعين السلسلة الوجهة إلى سلسلة فارغة. يفشل التحقق من صحة الإدخال إذا كان المؤشر المصدر أو الوجهة باطل أو إذا كان الحجم الأقصى للسلسلة الوجهة 0 أو أكبر من RSIZE_MAX. يعتبر الإدخال أيضًا غير صالح عند تجاوز العدد المحدد من الأحرف المراد نسخها RSIZE_MAX.

أ strncpy_s () يمكن أن تنجح العملية بالفعل عندما يتجاوز عدد الأحرف المحدد لنسخها الحد الأقصى لطول السلسلة الوجهة طالما أن السلسلة المصدر أقصر من الحد الأقصى لطول سلسلة الوجهة. إذا كان عدد الأحرف المراد نسخها أكبر من أو يساوي الحد الأقصى لحجم السلسلة الوجهة وكانت السلسلة المصدر أطول من المخزن المؤقت الوجهة ، فستفشل العملية.

لأن عدد الأحرف في المصدر مقيد بامتداد ن المعلمة والوجهة لها معلمة منفصلة تعطي الحد الأقصى لعدد العناصر في الوجهة ، ملف strncpy_s () يمكن للوظيفة نسخ سلسلة فرعية بأمان ، وليس مجرد سلسلة كاملة أو ذيلها.

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

strncpy_s (dest، sizeof dest، src، (sizeof dest] -1)

على الرغم من أن وظيفة OpenBSD strlcpy () مشابه ل strncpy ()، فهو أكثر شبهاً بـ strcpy_s () من ل strncpy_s (). على عكس strlcpy (), strncpy_s () يدعم التحقق من قيود وقت التشغيل مثل حجم مصفوفة الوجهة ، ولن يقوم باقتطاع السلسلة.

استخدام strncpy_s () من غير المرجح أن تقدم الوظيفة ثغرة أمنية لأنه يجب تحديد حجم المخزن المؤقت للوجهة والحد الأقصى لعدد الأحرف المطلوب إلحاقها. ضع في اعتبارك التعريفات التالية:

نظرًا لوجود مساحة تخزين كافية في مصفوفة الأحرف الوجهة ، فإن الاستدعاء التالي لـ strncpy_s () يعين القيمة 0 ل r1 والتسلسل مرحبا 0 ل dst1:

r1 = strncpy_s (dst1 ، sizeof (dst1) ، src1 ، sizeof (src1))

الاستدعاء التالي يعين القيمة 0 ل r2 والتسلسل جيد 0 ل dst2:

r2 = strncpy_s (dst2 ، sizeof (dst2) ، src2 ، 4)

ومع ذلك ، لا توجد مساحة كافية لنسخ ملف src1 سلسلة ل dst3. وبالتالي ، إذا كانت الدعوة التالية إلى strncpy_s () عائدات، r3 يتم تعيين قيمة غير صفرية و dst3 [0] تم تعيينه '':

r3 = strncpy_s (dst3 ، sizeof (dst3) ، src1 ، sizeof (src1))

لو strncpy () تم استخدامه بدلاً من strncpy_s ()، مجموعة الوجهة dst3 لم يتم إنهاؤها فارغة بشكل صحيح.

ال strncat_s () لا تلحق الدالة أكثر من عدد محدد من الأحرف المتتالية (لا يتم نسخ الأحرف التي تلي حرفًا فارغًا) من سلسلة مصدر إلى مصفوفة أحرف الوجهة. يحل الحرف الأولي من السلسلة المصدر محل الحرف الفارغ في نهاية الصفيف الوجهة. إذا لم يتم نسخ أي حرف فارغ من السلسلة المصدر ، فسيتم كتابة حرف فارغ في نهاية السلسلة الملحقة. ال strncat_s () الوظيفة لديها التوقيع التالي:

يحدث انتهاك لقيد وقت التشغيل و strncat_s () تقوم الدالة بإرجاع قيمة غير صفرية إذا كان مؤشر المصدر أو الوجهة باطل أو إذا كان الحد الأقصى لطول المخزن المؤقت الوجهة يساوي 0 أو أكبر من RSIZE_MAX. تفشل الوظيفة عندما تكون السلسلة الوجهة ممتلئة بالفعل أو إذا لم تكن هناك مساحة كافية لإلحاق سلسلة المصدر بالكامل. ال strncat_s () تضمن الوظيفة أيضًا إنهاء القيمة الفارغة لسلسلة الوجهة.

ال strncat_s () وظيفة لها معلمة إضافية تعطي حجم مصفوفة الوجهة لمنع تجاوز المخزن المؤقت. يجب أن تتلاءم السلسلة الأصلية في الوجهة بالإضافة إلى الأحرف الجديدة الملحقة من المصدر وأن يتم إنهاؤها فارغة لتجنب انتهاك قيود وقت التشغيل. في حالة حدوث انتهاك لقيد وقت التشغيل ، يتم تعيين مصفوفة الوجهة على سلسلة فارغة لزيادة رؤية المشكلة.

ال strncat_s () تتوقف الدالة عن إلحاق السلسلة المصدر بالمصفوفة الوجهة عند حدوث الشرطين التاليين:

  1. يتم نسخ سلسلة المصدر التي تنتهي بقيمة خالية إلى الوجهة.
  2. عدد الأحرف المحدد بواسطة ن تم نسخ المعلمة.

يتم توفير النتيجة في الوجهة مع حرف إنهاء فارغ إذا لم يتم نسخ أحدها من المصدر. يجب احتواء النتيجة ، بما في ذلك حرف النهاية الصفري ، مع الوجهة ، أو حدوث انتهاك لقيد وقت التشغيل. التخزين خارج صفيف الوجهة لا يتم تعديله أبدًا.

لأن عدد الأحرف في المصدر مقيد بامتداد ن المعلمة والوجهة لها معلمة منفصلة تعطي الحد الأقصى لعدد العناصر في الوجهة ، ملف strncat_s () يمكن للوظيفة إلحاق سلسلة فرعية بأمان ، وليس فقط سلسلة كاملة أو ذيلها.

نظرًا لأن اقتطاع السلسلة غير المتوقع يمثل ثغرة أمنية محتملة ، strncat_s () لا يقتطع المصدر (كما هو محدد بواسطة حرف النهاية الفارغ و ن المعلمة) لتناسب الوجهة. الاقتطاع هو انتهاك لقيد وقت التشغيل. ومع ذلك ، هناك مصطلح يسمح للبرنامج بفرض الاقتطاع باستخدام الامتداد strncat_s () وظيفة. إذا كان ن الوسيطة هي عدد العناصر ناقص 1 المتبقية في الوجهة ، strncat_s () سيُلحق المصدر بالكامل بالوجهة أو يقطعه ليلائم (كما هو الحال دائمًا ، سيتم إنهاء النتيجة فارغة). على سبيل المثال ، سيتم إلحاق المكالمة التالية src الى مصير صفيف ، ينتج عنه سلسلة منتهية بقيمة خالية في الملف مصير. سيتوقف التسلسل عندما مصير ممتلئ (بما في ذلك حرف النهاية الفارغ) أو عندما يكون كل src تم إلحاقه:

على الرغم من أن وظيفة OpenBSD strlcat () مشابه ل strncat ()، فهو أكثر شبهاً بـ strcat_s () من ل strncat_s (). على عكس strlcat (), strncat_s () يدعم التحقق من قيود وقت التشغيل مثل حجم مصفوفة الوجهة ، ولن يقوم باقتطاع السلسلة.

ال strncpy_s () و strncat_s () لا يزال بإمكان الوظائف تجاوز المخزن المؤقت إذا تم تحديد الحد الأقصى لطول المخزن المؤقت للوجهة وعدد الأحرف المراد نسخها بشكل غير صحيح.

وظائف التخصيص الديناميكي

تصف ISO / IEC TR 24731-2 [ISO / IEC TR 24731-2: 2010] strndup () وظيفة ، والتي يمكن استخدامها أيضًا كوظيفة بديلة لـ strncpy (). لا تحدد المواصفة ISO / IEC TR 24731-2 أي وظائف بديلة لـ strncat (). ال strndup () الوظيفة تعادل strdup () وظيفة ، مكررة السلسلة المقدمة في كتلة جديدة من الذاكرة المخصصة كما لو باستخدام مالوك ()، باستثناء أن strndup () نسخ ، على الأكثر ، ن بالإضافة إلى 1 بايت في الذاكرة المخصصة حديثًا ، مما يؤدي إلى إنهاء السلسلة الجديدة ببايت فارغ. إذا كان طول السلسلة أكبر من ن، فقط ن بايت مكررة. لو ن أكبر من طول السلسلة ، يتم نسخ كافة البايت الموجودة في السلسلة إلى مخزن الذاكرة المؤقت الجديد ، بما في ذلك البايت الفارغ المنتهي. سيتم دائمًا إنهاء السلسلة التي تم إنشاؤها حديثًا بشكل صحيح. يجب استعادة السلسلة المخصصة عن طريق تمرير المؤشر المرتجع إلى مجانا().

ملخص البدائل

يلخص الجدول 2.7 بعض الوظائف البديلة لاقتطاع النسخة الموضحة في هذا القسم.


خدمات تحليل SQL Server 2016

تتضمن SQL Server 2016 Analysis Services العديد من التحسينات الجديدة التي توفر أداءً محسنًا ، وتأليفًا أسهل للحلول ، وإدارة قاعدة بيانات مؤتمتة ، وعلاقات محسّنة مع التصفية ثنائية الاتجاه المتقاطعة ، ومعالجة الأقسام المتوازية ، وغير ذلك الكثير. في قلب معظم التحسينات لهذا الإصدار هو مستوى التوافق الجديد 1200 لقواعد بيانات النماذج المجدولة.

خدمات تحليل SQL Server 2016 Service Pack 1 (SP1)

توفر خدمات تحليل SQL Server 2016 Service SP1 أداءً محسنًا وقابلية للتوسع من خلال إدراك الوصول إلى الذاكرة غير المنتظم (NUMA) والتخصيص الأمثل للذاكرة استنادًا إلى لبنات بناء خيوط إنتل (إنتل تيرا بايت). تساعد هذه الوظيفة الجديدة على خفض التكلفة الإجمالية للملكية (TCO) من خلال دعم المزيد من المستخدمين على عدد أقل من خوادم المؤسسات الأكثر قوة.

على وجه الخصوص ، تتميز خدمات تحليل SQL Server 2016 SP1 بتحسينات في هذه المجالات الرئيسية:

  • الوعي NUMA - للحصول على دعم أفضل لـ NUMA ، يحتفظ المحرك الموجود في الذاكرة (VertiPaq) داخل Analysis Services الآن بقائمة انتظار مهام منفصلة على كل عقدة NUMA. يضمن هذا تشغيل مهام مسح المقطع على نفس العقدة حيث يتم تخصيص الذاكرة لبيانات المقطع. ملاحظة ، يتم تمكين الوعي NUMA بشكل افتراضي فقط على الأنظمة التي تحتوي على أربع عقد NUMA على الأقل. في الأنظمة ثنائية العقد ، لا تضمن تكاليف الوصول إلى الذاكرة المخصصة عن بُعد بشكل عام النفقات العامة لإدارة تفاصيل NUMA.
  • تخصيص الذاكرة - تم تسريع خدمات التحليل باستخدام Intel Threading Building Blocks ، وهو مخصص قابل للتطوير يوفر تجمعات ذاكرة منفصلة لكل نواة. مع زيادة عدد النوى ، يمكن للنظام التوسع بشكل خطي تقريبًا.
  • تجزئة الكومة - يساعد المخصص القابل للتطوير المستند إلى Intel TBB أيضًا في التخفيف من مشاكل الأداء بسبب تجزئة الكومة التي ثبت حدوثها مع Windows Heap.

أظهر اختبار الأداء وقابلية التوسع مكاسب كبيرة في معدل نقل الاستعلام عند تشغيل SQL Server 2016 SP1 Analysis Services على خوادم المؤسسات الكبيرة متعددة العقد.

على الرغم من أن معظم التحسينات في هذا الإصدار خاصة بالنماذج المجدولة ، فقد تم إجراء عدد من التحسينات على النماذج متعددة الأبعاد على سبيل المثال ، تحسين ROLAP للعدد المتميز لمصادر البيانات مثل DB2 و Oracle ، ودعم التنقل من خلال التحديد المتعدد باستخدام Excel 2016 و Excel تحسينات الاستعلام.

خدمات تحليل التوفر العام (GA) لـ SQL Server 2016

النمذجة

تحسين أداء النمذجة للنماذج المجدولة 1200

بالنسبة لطرازات 1200 الجدولة ، تكون عمليات البيانات الوصفية في SSDT أسرع بكثير من الطرز الجدولة 1100 أو 1103. بالمقارنة ، على نفس الجهاز ، يستغرق إنشاء علاقة على نموذج تم تعيينه على مستوى توافق SQL Server 2014 (1103) مع 23 جدولًا 3 ثوانٍ ، بينما تستغرق نفس العلاقة على نموذج تم إنشاؤه على مستوى التوافق 1200 أقل من ثانية بقليل .

تمت إضافة قوالب المشروع لطرازات 1200 الجدولة في SSDT

مع هذا الإصدار ، لم تعد بحاجة إلى نسختين من SSDT لبناء المشاريع العلائقية و BI. تضيف SQL Server Data Tools لـ Visual Studio 2015 قوالب مشاريع لحلول خدمات التحليل ، بما في ذلك خدمات التحليل جداول المشاريع تستخدم لبناء نماذج بمستوى توافق 1200. يتم أيضًا تضمين قوالب مشاريع خدمات التحليل الأخرى للحلول متعددة الأبعاد واستخراج البيانات ، ولكن على نفس المستوى الوظيفي (1100 أو 1103) كما في الإصدارات السابقة.

عرض المجلدات

مجلدات العرض متاحة الآن لطرازات 1200 الجدولة. تم تعريفها في SQL Server Data Tools وعرضها في تطبيقات العميل مثل Excel أو Power BI Desktop ، وتساعدك مجلدات العرض على تنظيم عدد كبير من المقاييس في مجلدات فردية ، وإضافة تسلسل هرمي مرئي لتسهيل التنقل في قوائم الحقول.

تصفية ثنائية الاتجاه

الجديد في هذا الإصدار هو نهج مضمن لتمكين عوامل التصفية ثنائية الاتجاه المتقاطعة في النماذج الجدولية ، مما يلغي الحاجة إلى حلول DAX المصممة يدويًا لنشر سياق عامل التصفية عبر علاقات الجدول. يتم إنشاء المرشحات تلقائيًا فقط عندما يمكن إنشاء الاتجاه بدرجة عالية من اليقين. إذا كان هناك غموض في شكل مسارات استعلام متعددة عبر علاقات الجداول ، فلن يتم إنشاء عامل تصفية تلقائيًا. راجع عوامل التصفية ثنائية الاتجاه للنماذج الجدولية في SQL Server 2016 Analysis Services للحصول على التفاصيل.

الترجمات

يمكنك الآن تخزين البيانات الوصفية المترجمة في نموذج جدولي 1200. تتضمن البيانات الوصفية في النموذج حقولًا لـ حضارهوالتعليقات التوضيحية المترجمة والأوصاف المترجمة. لإضافة الترجمات ، استخدم ملف نموذج & GT الترجمات الأمر في SQL Server Data Tools. راجع الترجمات في النماذج الجدولية (خدمات التحليل) للحصول على التفاصيل.

الجداول الملصقة

يمكنك الآن ترقية نموذج جدولي 1100 أو 1103 إلى 1200 عندما يحتوي النموذج على جداول ملصقة. نوصي باستخدام SQL Server Data Tools. في SSDT ، اضبط التوافقالمستوى إلى 1200 ثم نشرها إلى مثيل SQL Server 2017 من Analysis Services. راجع مستوى التوافق للنماذج الجدولية في Analysis Services للحصول على التفاصيل.

الجداول المحسوبة في SSDT

أ جدول محسوب هو بناء نموذج فقط يعتمد على تعبير أو استعلام DAX في SSDT. عند نشره في قاعدة بيانات ، لا يمكن تمييز الجدول المحسوب عن الجداول العادية.

هناك العديد من الاستخدامات للجداول المحسوبة ، بما في ذلك إنشاء جداول جديدة لعرض جدول موجود في دور معين. المثال الكلاسيكي هو جدول التاريخ الذي يعمل في سياقات متعددة (تاريخ الطلب وتاريخ الشحن وما إلى ذلك). من خلال إنشاء جدول محسوب لدور معين ، يمكنك الآن تنشيط علاقة جدول لتسهيل الاستعلامات أو تفاعل البيانات باستخدام الجدول المحسوب. استخدام آخر للجداول المحسوبة هو دمج أجزاء من الجداول الموجودة في جدول جديد تمامًا موجود فقط في النموذج. راجع إنشاء جدول محسوب لمعرفة المزيد.

إصلاح الصيغة

باستخدام إصلاح الصيغة على نموذج جدولي 1200 ، سيقوم SSDT تلقائيًا بتحديث أي مقاييس تشير إلى عمود أو جدول تمت إعادة تسميته.

دعم مدير تكوين Visual Studio

لدعم بيئات متعددة ، مثل بيئات الاختبار وما قبل الإنتاج ، يسمح Visual Studio للمطورين بإنشاء تكوينات متعددة للمشروع باستخدام مدير التكوين. النماذج متعددة الأبعاد تستفيد بالفعل من هذا ولكن النماذج المجدولة لم تفعل ذلك. باستخدام هذا الإصدار ، يمكنك الآن استخدام مدير التكوين للنشر على خوادم مختلفة.

إدارة المثيل

إدارة نماذج Tabular 1200 في SSMS

في هذا الإصدار ، يمكن لمثيل Analysis Services في وضع خادم جدولي تشغيل نماذج مجدولة في أي مستوى توافق (1100 ، 1103 ، 1200). تم تحديث أحدث إصدار من SQL Server Management Studio لعرض الخصائص وتوفير إدارة نموذج قاعدة البيانات للنماذج المجدولة بمستوى توافق 1200.

المعالجة المتوازية لأقسام الجدول المتعددة في النماذج الجدولية

يتضمن هذا الإصدار وظيفة معالجة متوازية جديدة للجداول التي تحتوي على قسمين أو أكثر ، مما يزيد من أداء المعالجة. لا توجد إعدادات تكوين لهذه الميزة. لمزيد من المعلومات حول تكوين الأقسام وجداول المعالجة ، راجع أقسام النموذج الجدولي.

أضف حسابات الكمبيوتر كمسؤولين في SSMS

يمكن لمسؤولي خدمات التحليل الآن استخدام SQL Server Management Studio لتكوين حسابات الكمبيوتر لتكون أعضاء في مجموعة مسؤولي خدمات التحليل. في ال حدد المستخدمون أو المجموعات الحوار ، اضبط المواقع لمجال أجهزة الكمبيوتر ثم قم بإضافة الامتداد أجهزة الكمبيوتر نوع الكائن. لمزيد من المعلومات ، راجع منح حقوق مسؤول الخادم لمثيل خدمات التحليل.

DBCC لخدمات التحليل

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

تحديثات الأحداث الممتدة

يضيف هذا الإصدار واجهة مستخدم رسومية إلى SQL Server Management Studio لتكوين وإدارة الأحداث الموسعة لخدمات التحليل. يمكنك إعداد تدفقات البيانات الحية لمراقبة نشاط الخادم في الوقت الفعلي ، أو الاحتفاظ ببيانات الجلسة محملة في الذاكرة لتحليل أسرع ، أو حفظ تدفقات البيانات في ملف لتحليلها دون اتصال بالإنترنت. لمزيد من المعلومات ، راجع مراقبة خدمات التحليل باستخدام أحداث SQL Server الموسعة.

البرمجة النصية

PowerShell للنماذج المجدولة

يتضمن هذا الإصدار تحسينات PowerShell للنماذج المجدولة عند مستوى التوافق 1200. يمكنك استخدام كافة أوامر cmdlets القابلة للتطبيق ، بالإضافة إلى أوامر cmdlets الخاصة بالوضع Tabular: Invoke-ProcessASDatabase و Invoke-ProcessTable cmdlet.

عمليات قاعدة بيانات البرمجة النصية SSMS

في أحدث SQL Server Management Studio (SSMS) ، تم الآن تمكين البرنامج النصي لأوامر قاعدة البيانات ، بما في ذلك إنشاء وتعديل وحذف ونسخ احتياطي واستعادة وإرفاق وفصل. الإخراج هو لغة برمجة نموذج جدولي (TMSL) في JSON. راجع مرجع لغة البرمجة النصية للنموذج الجدولي (TMSL) لمزيد من المعلومات.

تنفيذ خدمات التحليل مهمة DDL

يقبل Analysis Services Execute DDL Task الآن أيضًا أوامر لغة البرمجة النصية للطراز الجدولي (TMSL).

SSAS PowerShell cmdlet

SSAS PowerShell cmdlet استدعاء ASCmd يقبل الآن أوامر لغة البرمجة النصية للطراز الجدولي (TMSL). قد يتم تحديث أوامر cmdlets SSAS PowerShell الأخرى في إصدار مستقبلي لاستخدام البيانات الوصفية المجدولة الجديدة (سيتم استدعاء الاستثناءات في ملاحظات الإصدار). راجع مرجع PowerShell لخدمات التحليل للحصول على التفاصيل.

لغة البرمجة النموذجية الجدولية (TMSL) المدعومة في SSMS

باستخدام أحدث إصدار من SSMS ، يمكنك الآن إنشاء نصوص لأتمتة معظم المهام الإدارية لنماذج 1200 الجدولة. حاليًا ، يمكن برمجة المهام التالية: عملية على أي مستوى ، بالإضافة إلى إنشاء ، وتعديل ، وحذف على مستوى قاعدة البيانات.

وظيفيًا ، TMSL مكافئ لملحق XMLA ASSL الذي يوفر تعريفات كائنات متعددة الأبعاد ، باستثناء أن TMSL تستخدم واصفات أصلية مثل نموذج, الطاولة، و صلة لوصف البيانات الوصفية المجدولة. راجع مرجع لغة البرمجة النصية للنموذج الجدولي (TMSL) للحصول على تفاصيل حول المخطط.

قد يبدو البرنامج النصي الذي تم إنشاؤه المستند إلى JSON لنموذج جدولي كما يلي:

الحمولة عبارة عن مستند JSON يمكن أن يكون في حده الأدنى كما هو موضح أعلاه ، أو مزخرف للغاية بمجموعة كاملة من تعريفات الكائن. يصف مرجع لغة البرمجة النموذجية الجدولية (TMSL) بناء الجملة.

على مستوى قاعدة البيانات ، ستخرج أوامر CREATE و ALTER و DELETE النصي TMSL في نافذة XMLA المألوفة. يمكن أيضًا كتابة أوامر أخرى ، مثل العملية ، في هذا الإصدار. يمكن إضافة دعم البرنامج النصي للعديد من الإجراءات الأخرى في إصدار مستقبلي.

أوامر قابلة للكتابة وصف
خلق يضيف قاعدة بيانات أو اتصال أو قسم. ما يعادل ASSL هو CREATE.
إنشاء أو استبدال يحدّث تعريف كائن موجود (قاعدة بيانات أو اتصال أو قسم) عن طريق الكتابة فوق إصدار سابق. مكافئ ASSL هو ALTER مع تعيين AllowOverwrite على true و ObjectDefinition إلى ExpandFull.
حذف يزيل تعريف كائن. ASSL المكافئ هو DELETE.
تحديث يعالج الكائن. ASSL المكافئ هو PROCESS.

تحرير صيغة DAX المحسن

تساعدك التحديثات التي تم إجراؤها على شريط الصيغة على كتابة الصيغ بسهولة أكبر عن طريق التمييز بين الوظائف والحقول والمقاييس باستخدام تلوين بناء الجملة ، كما أنها توفر وظيفة ذكية واقتراحات للحقول وتخبرك إذا كانت أجزاء من تعبير DAX الخاص بك خاطئة باستخدام الخطأ تمايل. كما يسمح لك باستخدام أسطر متعددة (Alt + Enter) والمسافة البادئة (Tab). يتيح لك شريط الصيغة الآن أيضًا كتابة تعليقات كجزء من مقاييسك ، ما عليك سوى كتابة & quot // & quot وسيتم اعتبار كل شيء بعد هذه الأحرف في نفس السطر تعليقًا.

متغيرات DAX

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

دالات DAX الجديدة

مع هذا الإصدار ، تقدم DAX أكثر من خمسين وظيفة جديدة لدعم العمليات الحسابية السريعة والمرئيات المحسّنة في Power BI. لمعرفة المزيد ، راجع وظائف DAX الجديدة.

حفظ التدابير غير المكتملة

يمكنك الآن حفظ مقاييس DAX غير المكتملة مباشرةً في مشروع نموذجي 1200 مجدول واستلامه مرة أخرى عندما تكون جاهزًا للمتابعة.

تحسينات DAX الإضافية

  • عملية حسابية غير فارغة - لتقليل عدد عمليات المسح المطلوبة لغير الفارغة.
  • قياس الانصهار - سيتم دمج مقاييس متعددة من نفس الجدول في محرك تخزين واحد - استعلام.
  • مجموعات التجميع - عندما يطلب استعلام مقاييس متعددة المستويات (الإجمالي / السنة / الشهر) ، يتم إرسال استعلام واحد عند أدنى مستوى ويتم اشتقاق بقية التفاصيل من المستوى الأدنى.
  • حذف الانضمام المكرر - يقوم استعلام واحد لمحرك التخزين بإرجاع أعمدة الأبعاد وقيم القياس.
  • التقييم الصارم لـ IF / SWITCH - لن ينتج عن الفرع الذي تكون حالته خاطئة استعلامات محرك التخزين. في السابق ، تم تقييم الفروع بشغف ولكن تم تجاهل النتائج لاحقًا.

مطور

Microsoft.AnalysisServices.Tabular namespace for Tabular 1200 programmability in AMO

تم تحديث كائنات إدارة خدمات التحليل (AMO) لتتضمن مساحة اسم جدولة جديدة لإدارة مثيل وضع جدولي لـ SQL Server 2016 Analysis Services ، بالإضافة إلى توفير لغة تعريف البيانات لإنشاء أو تعديل نماذج 1200 مجدولة برمجيًا. قم بزيارة Microsoft.AnalysisServices.Tabular للقراءة على API.

تحديثات كائنات إدارة خدمات التحليل (AMO)

تمت إعادة تحليل كائنات إدارة خدمات التحليل (AMO) لتشمل تجميعًا ثانيًا ، Microsoft.AnalysisServices.Core.dll. يفصل التجميع الجديد الفئات الشائعة مثل الخادم وقاعدة البيانات والدور التي لها تطبيق واسع في خدمات التحليل ، بغض النظر عن وضع الخادم. في السابق ، كانت هذه الفئات جزءًا من تجميع Microsoft.AnalysisServices الأصلي. إن نقلهم إلى تجميع جديد يمهد الطريق لامتدادات مستقبلية لـ AMO ، مع تقسيم واضح بين واجهات برمجة التطبيقات العامة والخاصة بالسياق. لا تتأثر التطبيقات الحالية بالتجميعات الجديدة. ومع ذلك ، إذا اخترت إعادة إنشاء التطبيقات باستخدام تجميع AMO الجديد لأي سبب من الأسباب ، فتأكد من إضافة مرجع إلى Microsoft.AnalysisServices.Core. وبالمثل ، يجب الآن تحميل برامج PowerShell النصية التي يتم تحميلها واستدعاءها إلى AMO Microsoft.AnalysisServices.Core.dll. تأكد من تحديث أي نصوص.

محرر JSON لملفات BIM

يعرض Code View في Visual Studio 2015 الآن ملف BIM بتنسيق JSON للنماذج المجدولة 1200. يحدد إصدار Visual Studio ما إذا كان ملف BIM يتم تقديمه في JSON عبر محرر JSON المدمج ، أو كنص بسيط.

لاستخدام محرر JSON ، مع القدرة على توسيع أقسام النموذج وطيها ، ستحتاج إلى أحدث إصدار من SQL Server Data Tools بالإضافة إلى Visual Studio 2015 (أي إصدار ، بما في ذلك إصدار المجتمع المجاني). بالنسبة لجميع الإصدارات الأخرى من SSDT أو Visual Studio ، يتم تقديم ملف BIM في JSON كنص بسيط. كحد أدنى ، سيحتوي النموذج الفارغ على JSON التالي:

تجنب تحرير JSON مباشرة. يمكن أن يؤدي القيام بذلك إلى إتلاف النموذج.

عناصر جديدة في مخطط MS-CSDLBI 2.0

تم إضافة العناصر التالية إلى الملكية النوع المعقد المحدد في مخطط [MS-CSDLBI] 2.0:

جزء تعريف
القيمة الافتراضية خاصية تحدد القيمة المستخدمة عند تقييم الاستعلام. تعتبر خاصية DefaultValue اختيارية ، ولكن يتم تحديدها تلقائيًا إذا تعذر تجميع القيم من العضو.
إحصائيات مجموعة من الإحصائيات من البيانات الأساسية المرتبطة بالعمود. يتم تحديد هذه الإحصائيات بواسطة النوع المعقد TPropertyStatistics ولا يتم توفيرها إلا إذا لم تكن مكلفة من الناحية الحسابية عند إنشائها ، كما هو موضح في القسم 2.1.13.5 من مستند تنسيق ملف تعريف المخطط المفاهيمي مع التعليقات التوضيحية لذكاء الأعمال.

DirectQuery

تطبيق DirectQuery الجديد

يشهد هذا الإصدار تحسينات كبيرة في DirectQuery لطرازات 1200 المجدولة. هذا ملخص:

  • ينشئ DirectQuery الآن استعلامات أبسط توفر أداءً أفضل.
  • تحكم إضافي في تحديد مجموعات البيانات النموذجية المستخدمة في تصميم النموذج والاختبار.
  • يتم الآن دعم أمان مستوى الصف (RLS) لطرازات 1200 الجدولة في وضع DirectQuery. في السابق ، كان وجود RLS يمنع نشر نموذج جدولي في وضع DirectQuery.
  • الأعمدة المحسوبة مدعومة الآن لنماذج 1200 الجدولة في وضع DirectQuery. في السابق ، كان وجود الأعمدة المحسوبة يمنع نشر نموذج جدولي في وضع DirectQuery.
  • تتضمن تحسينات الأداء حذف الانضمام الزائد لـ VertiPaq و DirectQuery.

مصادر بيانات جديدة لوضع DirectQuery

تتضمن مصادر البيانات المدعومة لنماذج 1200 الجدولة في وضع DirectQuery الآن Oracle و Teradata و Microsoft Analytics Platform (المعروفة سابقًا باسم Parallel Data Warehouse). لمعرفة المزيد ، راجع وضع DirectQuery.


شاهد الفيديو: Python Tutorial For Beginners. Python Full Course From Scratch. Python Programming. Edureka