سؤال

أنا أستخدم برنامج Notepad++ لإجراء بعض عمليات استبدال النص في ملف لغة مكون من 5453 صفًا.تنسيق صفوف الملف هو:

variable.name = Variable Value Over Here, that''s for sure, Really

الفاصلة العليا المزدوجة مقصودة.

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

لقد عملت على هذا لبعض الوقت.كل ما لدي حتى الآن هو:

 (. )([A-Z])(.+)

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

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

المحلول

لا يمكن لاستبدال Regex تنفيذ الوظيفة (مثل الكتابة بالأحرف الكبيرة) في التطابقات.يجب عليك كتابة ذلك، على سبيل المثال.في PHP أو جافا سكريبت.

تحديث: يرى الجواب جوناس.

لقد بنيت لنفسي صفحة ويب تسمى المرافق النصية للقيام بهذا النوع من الأشياء:

  • لصق النص الخاص بك
  • انتقل إلى "بحث وتعبير واستبدال" (أو اضغط على كنترول+يحول+F)
  • أدخل التعبير العادي الخاص بك (سيكون لي ^(.*?\=\s*\w)(.*)$)
  • تحقق من خيار "^$ تطابق حدود السطر".
  • اختر "تطبيق وظيفة JS على التطابقات"
  • أضف الوسائط (الأول هو المطابقة، ثم الأنماط الفرعية)، هنا s, start, rest
  • تغيير بيان العودة إلى return start + rest.toLowerCase();

تبدو الوظيفة النهائية في منطقة النص كما يلي:

return function (s, start, rest) {
     return start + rest.toLowerCase();
};

ربما أضف بعض التعليمات البرمجية لتكبير بعض الكلمات مثل "حقًا" و"هنا".

نصائح أخرى

Find:    (. )([A-Z])(.+)
Replace: \1\U\2\L\3

في المفكرة ++ 6.0 أو أفضل (الذي يأتي مع المدمج في دعم PCRE ).

في برنامج Notepad++، يمكنك استخدام مكون إضافي يسمى PythonScript للقيام بهذه المهمة.إذا قمت بتثبيت البرنامج المساعد، قم بإنشاء برنامج نصي جديد مثل هذا:

enter image description here

ثم يمكنك استخدام البرنامج النصي التالي، واستبدال متغيرات regex والوظيفة كما تراه مناسبًا:

import re

#change these
regex = r"[a-z]+sym"
function = str.upper

def perLine(line, num, total):
for match in re.finditer(regex, line):
    if match:
        s, e = match.start(), match.end()
        line = line[:s] + function(line[s:e]) + line[e:]
        editor.replaceWholeLine(num, line)

editor.forEachLine(perLine)

يعمل هذا المثال تحديدًا من خلال البحث عن جميع المطابقات في سطر معين، ثم تطبيق الدالة على كل تطابق.إذا كنت بحاجة إلى دعم متعدد الأسطر، فإن برنامج Python Script "Conext-Help" يشرح جميع الوظائف المقدمة بما في ذلك وظائف pymlsearch/pymlreplace المحددة ضمن كائن "editor".

عندما تكون مستعدًا لتشغيل البرنامج النصي الخاص بك، انتقل إلى الملف الذي تريد تشغيله عليه أولاً، ثم انتقل إلى "البرامج النصية >" في قائمة Python Script وقم بتشغيل البرنامج النصي الخاص بك.

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

ملاحظة.يمكنك "البحث" و"وضع علامة" على كل تكرار لتعبير عادي باستخدام مربع حوار البحث المدمج في برنامج notepad++، وإذا كان بإمكانك تحديدها كلها، فيمكنك استخدام وظيفة "الأحرف->الأحرف العليا" في TextFX لهذه المشكلة تحديدًا، لكنني' لست متأكدًا من كيفية الانتقال من النص المحدد أو الذي تم العثور عليه إلى النص المحدد.لكنني اعتقدت أنني سأنشر هذا في حالة قيام أي شخص بذلك ...

يحرر: في Notepad++ 6.0 أو أعلى، يمكنك استخدام "بحث/استبدال PCRE (التعبير العادي المتوافق مع Perl)" (المصدر: http://sourceforge.net/apps/mediawiki/notepad-plus/?title=Regular_Expressions) لذلك كان من الممكن حل هذه المشكلة باستخدام regex like (. )([A-z])(.+) مع وسيطة بديلة مثل \1\U\2\3.

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

find:    ([\.\r\n][ ]*)([A-Za-z\r])([^\.^\r^\n]+) 
replace: \1\U\2\L\3

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

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