2016-05-11 6 views
8

Ich schaute auf die Rust docs for String, aber ich finde keine Möglichkeit, eine Teilzeichenfolge zu extrahieren.Gibt es eine Methode wie JavaScript substr in Rust?

Gibt es eine Methode wie JavaScript in Rust? Wenn nicht, wie würden Sie es umsetzen?

str.substr(start[, length]) 

Der nächste ist wahrscheinlich slice_unchecked aber es nutzt anstelle von Zeichenindizes Byteversätze und unsafe markiert.

Antwort

11

Für Zeichen, können Sie s.chars().skip(pos).take(len) verwenden:

fn main() { 
    let s = "Hello, world!"; 
    let ss: String = s.chars().skip(7).take(5).collect(); 
    println!("{}", ss); 
} 

obwohl der Definition von Unicode-Zeichen Vorsicht.

Für Bytes, können Sie die Slice-Syntax verwenden:

fn main() { 
    let s = "Hello, world!"; 
    let ss = &s[7..12]; 
    println!("{}", ss); 
} 
+0

Sieht nicht 'Zeichen()', danke! Wäre es auch möglich, den Char-Index einem Byte-Offset zuzuordnen und daraus ein Slice zu erstellen? – laktak

+2

@laktak, Sie können 'str :: char_indices' dafür verwenden. https://doc.rust-lang.org/std/primitive.str.html#method.char_indices – WiSaGaN

9

Sie können die as_str Methode auf dem Chars Iterator verwenden, um eine &str Scheibe zurück zu bekommen, nachdem Sie auf dem Iterator verstärkt haben. So überspringen die ersten start Zeichen, können Sie

let s = "Some text to slice into"; 
let mut iter = s.chars(); 
iter.by_ref().nth(start); // eat up start values 
let slice = iter.as_str(); // get back a slice of the rest of the iterator 

Jetzt anrufen, wenn Sie auch die Länge begrenzen wollen, müssen Sie zuerst die Byte-Position des length Charakter, um herauszufinden:

let end_pos = slice.char_indices().nth(length).map(|(n, _)| n).unwrap_or(0); 
let substr = &slice[..end_pos]; 

Dies könnte ein kleiner Kreisverkehr sein, aber Rust versteckt nichts vor Ihnen, das CPU-Zyklen in Anspruch nehmen könnte. Das heißt, ich frage mich, warum es noch keine Kiste gibt, die eine substr Methode anbietet.

+0

"nichts von Ihnen versteckt, die CPU-Zyklen aufnehmen könnte" - können Sie erklären, warum substr teurer sein könnte als jeder von die Trimm-Funktionen hat es? – laktak

+1

Nun ... die Trim-Funktionen werden erwartet, dass sie alle Leerräume, auf die sie stoßen, loswerden. Dies ist per Definition eine O (n) -Operation. Aber mit einer 'substr'-Methode könnte der Benutzer annehmen, dass es O (1) ist, weil sie Indizes eingeben. –

1

Für my_string.substring(start, len) -ähnliche Syntax, können Sie eine benutzerdefinierte Eigenschaft schreiben:

trait StringUtils { 
    fn substring(&self, start: usize, len: usize) -> Self; 
} 

impl StringUtils for String { 
    fn substring(&self, start: usize, len: usize) -> Self { 
     self.chars().skip(start).take(len).collect() 
    } 
} 

// Usage: 
fn main() { 
    let phrase: String = "this is a string".to_string(); 
    println!("{}", phrase.substring(5, 8)); // prints "is a str" 
} 
Verwandte Themen