2009-10-18 7 views
6

ओकैमल की मूल बातें सीखने के लिए, मैं इसे उपयोग करने में आसान facebook engineering puzzles में से एक को हल कर रहा हूं। अनिवार्य रूप से, मैं निम्नलिखित पायथन कोड की तरह कुछ करने के लिए करना चाहते हैं:मैं ओकैमल में एक स्ट्रिंग से व्हाइटस्पेस कैसे लगा सकता हूं?

some_str = some_str.strip() 

है कि, मैं शुरुआत और अंत से खाली स्थान के के सभी पट्टी करना चाहते हैं। मुझे OCaml Str लाइब्रेरी में ऐसा करने के लिए कुछ भी स्पष्ट नहीं दिख रहा है। क्या ऐसा करने का कोई आसान तरीका है, या मुझे ऐसा करने के लिए कुछ कोड लिखना होगा (जो मुझे बुरा नहीं लगेगा, लेकिन यह पसंद नहीं करेगा :))।

ध्यान रखें कि मैं पुस्तकालयों में क्या सीमित हूं जो ओकैमल वितरण के साथ आता है।

उत्तर

5

कैसे

के बारे में
let trim str = 
    if str = "" then "" else 
    let search_pos init p next = 
    let rec search i = 
     if p i then raise(Failure "empty") else 
     match str.[i] with 
     | ' ' | '\n' | '\r' | '\t' -> search (next i) 
     | _ -> i 
    in 
    search init 
    in 
    let len = String.length str in 
    try 
    let left = search_pos 0 (fun i -> i >= len) (succ) 
    and right = search_pos (len - 1) (fun i -> i < 0) (pred) 
    in 
    String.sub str left (right - left + 1) 
    with 
    | Failure "empty" -> "" 

(Code Codex वाया)

+3

यह सवाल गूगल के शीर्ष पेज पर है। तो एक त्वरित लुकअप के लिए मैं यहां एक जवाब डाल रहा हूं। यह String.strip –

5

यह वास्तव में, मानक पुस्तकालय के लिए अपने आप को सीमित करने के लिए के बाद से मानक ilbrary बहुत कुछ याद आ रही है एक गलती है। , उदाहरण के लिए, आप कोर का उपयोग करने के लिए गए थे, तो आप बस कर सकता है:

open Core.Std 

let x = String.strip " foobar " 
let() = assert (x = "foobar") 

आप निश्चित रूप से कोर के स्रोतों पर देख सकते हैं यदि आप कार्यान्वयन देखना चाहते हैं। ExtLib में एक समान कार्य है।

+0

शायद मैं गलत टाइप करता हूं। नियम कहते हैं: "आप भाषा/दुभाषिया के हिस्से से परे किसी भी पुस्तकालय या प्लगइन्स की गारंटी नहीं देते हैं।" वितरण INRIA OCaml है। क्या कोर उस श्रेणी के अंतर्गत आती है? –

+3

कोर मानक पुस्तकालय का हिस्सा नहीं है। यह एक तीसरी पार्टी लाइब्रेरी है जो मानक (जैसे एक्स्टिब और बैटरियों) को बढ़ाती है। आप इसे यहां डाउनलोड कर सकते हैं: http://janestcapital.com/?q=node/13 –

8

मैं जानता हूँ कि इस सवाल का uber की उम्र है, लेकिन मैं तो बस (उच्चस्तरीय से) एक ही बात पर विचार और आया-अप इस के साथ किया गया था:

let strip str = 
    let str = Str.replace_first (Str.regexp "^ +") "" str in 
    Str.replace_first (Str.regexp " +$") "" str;;   
val strip : string -> string = <fun> 
तो

strip " Hello, world! ";; 
- : string = "Hello, world!" 

अद्यतन:

4.00.0 के रूप में, मानक पुस्तकालय में String.trim

1

मुझे विश्वास है कि टी वह इंगित करता है कि जब अन्य उत्तरों दिए गए थे, संस्करण 4.00 अभी तक बाहर नहीं था। असल में, ओकैमल 4.00 में, string module में एक स्ट्रिंग.ट्रिम फ़ंक्शन है जो सफेद और पिछली सफेद जगहों को ट्रिम करने के लिए है।

वैकल्पिक रूप से, यदि आप ओकैमल के पुराने संस्करण तक ही सीमित हैं, तो आप इस फ़ंक्शन का उपयोग कर सकते हैं जो 4.00 के स्ट्रिंग मॉड्यूल के source से बेकार ढंग से कॉपी किया गया है।

let trim s = 
    let is_space = function 
    | ' ' | '\012' | '\n' | '\r' | '\t' -> true 
    | _ -> false in 
    let len = String.length s in 
    let i = ref 0 in 
    while !i < len && is_space (String.get s !i) do 
    incr i 
    done; 
    let j = ref (len - 1) in 
    while !j >= !i && is_space (String.get s !j) do 
    decr j 
    done; 
    if !i = 0 && !j = len - 1 then 
    s 
    else if !j >= !i then 
    String.sub s !i (!j - !i + 1) 
    else 
    "" 
;; 
0

कुछ इस तरह साधारण ठीक काम करना चाहिए:

#require "str";; 

let strip_string s = 
    Str.global_replace (Str.regexp "[\r\n\t ]") "" s 
+0

यदि आप कोई उत्तर प्रदान करते हैं जिसके लिए अतिरिक्त संकलन झंडे की आवश्यकता होती है, तो कृपया इस कोड को वास्तव में संकलित करने के लिए आवश्यक सभी चीज़ें शामिल करें। –

+0

इसे इंगित करने के लिए धन्यवाद। मैंने स्ट्र मॉड्यूल के लिए आवश्यकता को जोड़ा। – Thomas