سؤال

هذا ليس بسيطا كما يبدو. معظمكم من المرجح أن يفكر في ريجيكس /([A-Z])/_$1/ كما وجدت في جميع أنحاء الإنترنت، لكن وضعي الخاص أكثر تعقيدا. تحتوي سلسلة المصدر الخاصة بي على مزيد من المحتوى الذي أنا لا تريد تحويلها قبل جزء أنا فعل.

النظر في وضع منتظم:

public function setUserId()

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

public function setUserId($user_id)

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

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

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

هل كانت مفيدة؟

المحلول

البحث أولا عن تعريفات الوظائف، ثم في كل مباراة، أدخل معلمة استنادا إلى اسم الوظيفة.

/\b(function\s+set([A-Z]\w*))\b\s*\(\)/g

هذا النمط سوف يعطيك المباريات مع function-جميع اسم وظيفة الوظيفة في المجموعة 1، والجزء الذي يتم غسل الهجن من اسم الوظيفة في المجموعة 2.

/([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))/g

ستجد هذا النمط الحرف الأخير قبل تسلسل الحالة العلوي / الأدنى الذي يشكل Camel-Case.

أنت لم تحدد اللغة التي ستستخدمها، لذلك هنا هو مظاهرة باستخدام بيثون:

import re

pattern1 = re.compile(r'\b(function\s+set([A-Z]\w*))\b\s*\(\s*\)')
pattern2 = re.compile(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))')

def fix_setters(code):
    def replacer(match):
        var_name = pattern2.sub(r'\1_', match.group(2)).lower()
        return "%s($%s)" % (match.group(1), var_name)
    return pattern1.sub(replacer, code)

السطر الأخير ("return pattern1.sub(replacer, code)")، يستخدم رد اتصال لتوليد النص المراد استبداله. يجب أن تكون هناك وظيفة مماثلة في معظم اللغات.

يستخدم Python (قبل الإصدار 3.0) مشغل Modulus ("%") للتنسيق، على غرار sprintf في مثل اللغة C.

مثال:

>>> s = """\
... public function setUserName() {
...   blaha
... }
... """
>>> print s
public function setUserName() {
  blaha
}

>>> print fix_setters(s)
public function setUserName($user_name) {
  blaha
}

>>>

معلومات اكثر: .NET - كيف يمكنك تقسيم سلسلة محددة "قبعات" في صفيف؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top