2011-01-19 22 views
7

यहाँ में एक फ़ाइल एक्सटेंशन को बदलने के लिए एक संस्करण का उपयोग कर विभाजन लिखा है foo.bar.coffeefoo.bar.js में।स्काला अभिव्यक्ति एक स्ट्रिंग

मैं क्या पसंद:

  • यह काम करता है
  • यह indexOf()
  • यह कार्यात्मक लगता है जैसे चीजों पर निर्भर नहीं करता;)

मैं क्या पसंद नहीं है:

  • यह उतना छोटा नहीं है जितना मैं आशा करता हूं कि
  • यह कुछ पाठकों

भ्रमित कर सकते हैं मैं एक और भी आसान/सरल संस्करण कैसे लिख सकता है?

अद्यतन: नीचे दिए गए महान उत्तर! संक्षेप में:

  • बुरा नहीं थी, हालांकि यह कुछ कोने मामलों को कवर नहीं करता ऊपर अपने मूल दृष्टिकोण की तरह लगता है, लेकिन है कि यदि आप उन
  • एक और कवर करने के लिए की जरूरत है, थोड़ा कम दृष्टिकोण एक लंबे समय तक अभिव्यक्ति के साथ सुधारी जा सकने वाली है regexps, जो आपके regexp पृष्ठभूमि पर कम या ज्यादा पठनीय आधार पर नहीं किया जा सकेगा
  • मूल दृष्टिकोण के लिए एक से थोड़ा कम वाक्य रचना (कोने मामलों में शामिल नहीं) पढ़ता है:

    fileName.split('.').init :+ "js" mkString "."

+2

रिकॉर्ड के लिए है के साथ काम lastIndexOf के साथ बहुत आसान है, और, यह मेरे लिए बहुत सरल है। –

+1

मैं राफे से सहमत हूं। मैं व्यक्तिगत रूप से नियमित अभिव्यक्ति संस्करणों से बेहतर पसंद करता हूं। हालांकि, यह फ़ाइल नामों के साथ अच्छी तरह से काम नहीं करता है जिसमें कोई एक्सटेंशन नहीं है। आप '++ सेक (" जेएस ") से इसे ': +" जेएस "' के साथ बदलकर, से छुटकारा पा सकते हैं। – Madoc

+0

ध्यान रखें कि आप जो करना चाहते हैं उसके आधार पर, डबल एक्सटेंशन वाले फाइलों को "सही" नहीं माना जाता है, उदा। 'x.tar.gz'' x.tar.js' – Raphael

उत्तर

9

मुझे डर है कि आप वास्तव में यह अब क्या शायद सबसे समझदार मजबूत बात यह है करने के लिए करना है कर रहा हूँ:

scala> "oops".split('.').init ++ Seq("js") mkString "." 
res0: String = js 

किंडा अपनी फ़ाइल का नाम कम करने के लिए (कम से कम अगर आप 'अप्रत्याशित एक अंतिम उपयोगकर्ता फिर से)!

के regex कोशिश करते हैं:

scala> "oops".replaceAll("\\.[^.]*$", ".js") 
res1: java.lang.String = oops 

फ़ाइल नाम खोना नहीं था, लेकिन कोई विस्तार या तो है। एसीके।

के इसे ठीक कर दो:

def extensor(orig: String, ext: String) = (orig.split('.') match { 
    case xs @ Array(x) => xs 
    case y => y.init 
}) :+ "js" mkString "." 

scala> extensor("oops","js") 
res2: String = oops.js 

scala> extensor("oops.txt","js") 
res3: String = oops.js 

scala> extensor("oops...um...","js") 
res4: String = oops...js 

या रेगुलर एक्सप्रेशन के साथ:

scala> "oops".replaceAll("\\.[^.]*$", "") + ".js" 
res5: java.lang.String = oops.js 

scala> "oops.txt".replaceAll("\\.[^.]*$", "") + ".js" 
res6: java.lang.String = oops.js 

scala> "oops...um...".replaceAll("\\.[^.]*$", "") + ".js" 
res7: java.lang.String = oops...um...js 

(कोने मामले में जहां फ़ाइल नाम अवधि के साथ समाप्त होता पर अलग व्यवहार पर ध्यान दें।)

+0

मुझे जो कचरा मिल रहा है वह यह है कि फाइलनाम के खंडित खंडों के लिए सभी सबस्ट्रिंग्स बनाए जा रहे हैं, और फिर बाद में फिर से सम्मिलित किए गए। इससे बचने के लिए, 'lastIndexOf' का उपयोग करना अच्छा होगा, जिसे ओपी पसंद नहीं आया था। हालांकि, मुझे लगता है कि यह एक अच्छा विचार होगा। – Madoc

+0

@ मैडोक - संभवतः आप इन परिचालनों को कर रहे हैं क्योंकि आप फ़ाइलों के साथ काम करना चाहते हैं। एक विशिष्ट फ़ाइल ऑपरेशन को विभाजित + mkString से तुलना में कितना समय लगता है? –

+0

मैं उम्मीद करता हूं कि वीएम इसे दूर करने के लिए वैसे भी अनुकूलित करेगी। – Raphael

3

क्या एक साधारण रेगेक्स प्रतिस्थापन चाल करेगा?

तरह:

scala> "package.file.java".replaceAll("(\\.[^\\.]*$)", ".rb") 
scala> "package.file.rb" 
+0

हाहा, हैलो एरिक। आपको मुझ पर 12 सेकंड मिले, लेकिन मेरा 2 छोटा छोटा है। ;) – Synesso

+0

मुझे पता था कि मुझे अपने रेगेक्स फू को सुधारना है, ... – Eric

2

तुम हमेशा java.lang.String

scala> "foo.bar.coffee".replaceAll("\\.[^.]*$", ".js") 
res11: java.lang.String = foo.bar.js 

पर replaceAll विधि का उपयोग कर सकता है यह छोटा लेकिन कम पठनीय है।

2

क्या बुराई है lastIndexOf?

fileName.take(1 + fileName.lastIndexOf(".")) + "js" 
बेशक

आपको फ़ाइल नाम रखने के लिए जब यह किसी भी डॉट शामिल नहीं करता चाहते हैं तो आपको मैं यहाँ गति के लिए जाना होगा थोड़ा और अधिक करने के लिए

(if (fileName.contains('.')) fileName.take(fileName.lastIndexOf(".")) 
else fileName) + ".js" 
+0

इंडेक्स के साथ बिल्कुल कुछ भी गलत नहीं है। लेकिन संक्षेप में मैं यह देखने की कोशिश कर रहा था कि अन्य दृष्टिकोण आपको कहाँ ले जाते हैं। यह '(i = 0; i ebruchez

2

तो जरूरत है,। जैसा कि होता है, substring स्थिर समय है क्योंकि यह केवल स्ट्रिंग की प्रतिलिपि नहीं करता है। तो,

((index: Int) => (
) + ".js")(fileName lastIndexOf '.') 

यह बंद होने का उपयोग करता है, जो इसे थोड़ा धीमा कर देगा। तेज़:

def addJS(fileName: String) = { 
    def addJSAt(index: Int) = (
     if (index >= 0) fileName substring (0, index) 
     else fileName 
    ) + ".js" 

    addJSAt(fileName lastIndexOf '.') 
} 

संपादित करें: ऐसा होता, जावा अब substring पर स्ट्रिंग कॉपी करता है।

+0

जब आप गति के लिए जा रहे हैं तो कुछ गड़बड़ है और मैं पैटर्न मैचों को लिख रहा हूं और चिंता न करने के लिए कह रहा हूं .... –

+0

@Rex अरे, ऐसा नहीं है कि आप मुझे जाने के लिए कुछ और छोड़ दें ... :-) –

+0

I पता है कि यह प्राचीन है, बस सोच रहा है कि 'def addJS (fileName: String) = { वैल इंडेक्स = fileName lastIndexOf' जैसी चीज़ों के बजाय नेस्टेड फ़ंक्शन का उपयोग करने के लिए प्रदर्शन या अन्य कारण है। (अगर (अनुक्रमणिका> = 0) फ़ाइल नाम सबस्ट्रिंग (0, अनुक्रमणिका) अन्य फ़ाइल नाम ) + ".js" } ' – Davos

2

फ़ाइल नाम एक से अधिक डॉट

def getFileNameWithoutExtension(fileName: String): String = { 
    fileName.dropRight(fileName.length - fileName.lastIndexOf(".")) 
} 

val fileName = "foo.bar.coffee" 

getFileNameWithoutExtension(fileName) + ".js" 

परिणाम होता है कि foo.bar.js

संबंधित मुद्दे