Extract file extension: Difference between revisions

Content added Content deleted
(→‎{{header|Racket}}: Several Improvements)
Line 240: Line 240:
<lang Racket>#lang racket
<lang Racket>#lang racket


;; Note that for a real implementation, Racket has a
(define (string-suffix x)
;; `filename-extension` in its standard library, but don't use it here
(define v (regexp-match #px"\\.[[:alnum:]]+$" x))
;; since it requires a proper name (fails on ""), returns a byte-string,
(if v
;; and handles path values so might run into problems with unicode
(car v)
;; string inputs.
""))


(define (string-suffix/unicode x)
(define (string-extension x)
(define v (regexp-match #px"\\.(?:\\p{L}|\\p{N}|\\p{M})+$" x))
(cadr (regexp-match #px"(\\.[[:alnum:]]+|)$" x)))
(if v
(car v)
""))


(define (string-extension/unicode x)
(define examples (list "picture.jpg"
(cadr (regexp-match #px"(\\.(?:\\p{L}|\\p{N}|\\p{M})+|)$" x)))
"http://mywebsite.com/picture/image.png"
"myuniquefile.longextension"
"IAmAFileWithoutExtension"
"/path/to.my/file"
"file.odd_one"
""
;Extra, with unicode
"café.png"
"file.resumé"
; with unicode combining characters
"cafe\u0301.png"
"file.resume\u0301"))


(define examples '("picture.jpg"
(displayln "Official task")
"http://mywebsite.com/picture/image.png"
(for-each (lambda (x) (printf "~s ==> ~s\n" x (string-suffix x)))
examples)
"myuniquefile.longextension"
"IAmAFileWithoutExtension"
(newline)
"/path/to.my/file"
"file.odd_one"
""
;; Extra, with unicode
"café.png"
"file.resumé"
;; with unicode combining characters
"cafe\u0301.png"
"file.resume\u0301"))

(printf "Official task:\n")
(for ([x (in-list examples)])
(printf "~s ==> ~s\n" x (string-extension x)))

(printf "\nWith unicode support:\n")
(for ([x (in-list examples)])
(printf "~s ==> ~s\n" x (string-extension/unicode x)))
</lang>


(displayln "With unicode support")
(for-each (lambda (x) (printf "~s ==> ~s\n" x (string-suffix/unicode x)))
examples)</lang>
{{out}}
{{out}}
<pre>Official task
<pre>Official task:
"picture.jpg" ==> ".jpg"
"picture.jpg" ==> ".jpg"
"http://mywebsite.com/picture/image.png" ==> ".png"
"http://mywebsite.com/picture/image.png" ==> ".png"
"myuniquefile.longextension" ==> ".longextension"
"myuniquefile.longextension" ==> ".longextension"
"IAmAFileWithoutExtension" ==> ""
"IAmAFileWithoutExtension" ==> ""
"/path/to.my/file" ==> ""
"/path/to.my/file" ==> ""
"file.odd_one" ==> ""
"file.odd_one" ==> ""
"" ==> ""
"" ==> ""
"café.png" ==> ".png"
"café.png" ==> ".png"
"file.resumé" ==> ""
"file.resumé" ==> ""
"café.png" ==> ".png"
"café.png" ==> ".png"
"file.resumé" ==> ""
"file.resumé" ==> ""


With unicode support
With unicode support:
"picture.jpg" ==> ".jpg"
"picture.jpg" ==> ".jpg"
"http://mywebsite.com/picture/image.png" ==> ".png"
"http://mywebsite.com/picture/image.png" ==> ".png"
"myuniquefile.longextension" ==> ".longextension"
"myuniquefile.longextension" ==> ".longextension"
"IAmAFileWithoutExtension" ==> ""
"IAmAFileWithoutExtension" ==> ""
"/path/to.my/file" ==> ""
"/path/to.my/file" ==> ""
"file.odd_one" ==> ""
"file.odd_one" ==> ""
"" ==> ""
"" ==> ""
"café.png" ==> ".png"
"café.png" ==> ".png"
"file.resumé" ==> ".resumé"
"file.resumé" ==> ".resumé"
"café.png" ==> ".png"
"café.png" ==> ".png"
"file.resumé" ==> ".resumé"</pre>
"file.resumé" ==> ".resumé"
</pre>


=={{header|REXX}}==
=={{header|REXX}}==