سؤال

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

وهنا بعض الأمثلة من المدخلات والمخرجات:

myfile.png     -> myfile
myfile.png.jpg -> myfile.png

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

فقط للعلم أنا أفعل هذا في جافا سكريبت

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

المحلول

/(.*)\.[^.]+$/

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

نصائح أخرى

وفقط للتأكد من اكتمالها: كيف يمكن تحقيق ذلك من دون التعبير العادية

var input = 'myfile.png';
var output = input.substr(0, input.lastIndexOf('.')) || input;

وو|| input يعتني القضية، حيث يوفر lastIndexOf() على -1. ترى، انها لا تزال الخطوط الملاحية المنتظمة واحد.

/^(.+)(\.[^ .]+)?$/

حالات الاختبار حيث يعمل هذا فشل الآخرين:

  • ".htaccess" (الرائدة الفترة)
  • "ملف" (أي امتداد الملف)
  • "إرسال إلى السيدة." (لا تمديد ، ولكن ينتهي في ابر.)
  • "الإصدار 1.2 من المشروع" (أي تمديد ، ومع ذلك لا يزال يحتوي على فترة)

القاسم المشترك أعلاه هو بالطبع "تالف" امتداد الملف.ولكن دائما يكون لديك للتفكير في تلك الحالات الزاوية.:P

حالات الاختبار حيث فشل هذا:

  • "الإصدار 1.2" (أي امتداد الملف لكن "يبدو" أن يكون واحد)
  • "name.tar.gz" (إذا قمت بعرض هذا "المركب التمديد" وأراد أنها تنقسم إلى "اسم" و ".tar.gz")

كيفية التعامل مع هذه إشكالية وأفضل قررت على أساس مشاريع محددة.

التعبير العادي لتتناسب مع نمط هو:

/\.[^.]*$/

فإنه يجد فترة حرف (\.) ، تليها 0 أو أكثر من الأحرف التي ليست فترات ([^.]*) ، تليها نهاية السلسلة ($).

console.log( 
  "aaa.bbb.ccc".replace(/\.[^.]*$/,'')
)

/^(.+)(\.[^ .]+)?$/

وفوق نمط من الخطأ - وسوف تشمل دائما التمديد أيضا. انها بسبب الكيفية التي يعمل بها المحرك رجإكس جافا سكريبت. الرمز المميز (\.[^ .]+) هو اختياري وبالتالي فإن المحرك تطابق بنجاح السلسلة بأكملها مع (.+) http://cl.ly/image/3G1I3h3M2Q0M


وهنا لي حل التعبير العادي اختبارها.

وهذا النمط سوف تتطابق filenameNoExt مع / بدون تمديد في المسار، واحترام كل من خفض وفواصل مائل

var path = "c:\some.path/subfolder/file.ext"
var m = path.match(/([^:\\/]*?)(?:\.([^ :\\/.]*))?$/)
var fileName = (m === null)? "" : m[0]
var fileExt  = (m === null)? "" : m[1]

وتشريح نمط أعلاه:

([^:\\/]*?)  // match any character, except slashes and colon, 0-or-more times,
             // make the token non-greedy so that the regex engine
             // will try to match the next token (the file extension)
             // capture the file name token to subpattern \1

(?:\.        // match the '.' but don't capture it
([^ :\\/.]*) // match file extension
             // ensure that the last element of the path is matched by prohibiting slashes
             // capture the file extension token to subpattern \2
)?$          // the whole file extension is optional

http://cl.ly/image/3t3N413g3K09

http://www.gethifi.com/tools/regex

وهذا سوف تغطي جميع الحالات التي تم ذكرهاRogerPate لكن بما في ذلك المسارات الكاملة للغاية

آخر لا regex طريقة لفعل ذلك ("oposite" من @راهول نسخة ، وليس باستخدام pop() إزالة)

أنها لا تتطلب أن أشير إلى متغير مرتين, لذلك فإنه من السهل أن مضمنة

filename.split('.').slice(0,-1).join()

وهذا سوف نفعل ذلك أيضا:)

'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');

وكنت التمسك التعبير العادي على الرغم من ... = P

  return filename.split('.').pop();

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

في جافا سكريبت يمكنك استدعاء الأسلوب استبدال () التي سوف تحل محل القائمة على تعبير عادي.

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

/^(.*)\..*$/

وكيف تنفيذ استبدال يمكن العثور عليها في هذا السؤال ستاكوفيرفلوو.

جافا سكريبت التعابير المنطقية السؤال

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