আমি কীভাবে মরিচায় একটি স্ট্রিং বিভক্ত করব?


143

ডকুমেন্টেশন থেকে , এটি পরিষ্কার নয়। জাভাতে আপনি এই splitপদ্ধতিটি ব্যবহার করতে পারেন :

"some string 123 ffd".split("123");


@bow কি কোনও ভেক্টরের পরিবর্তে স্ট্রিং অ্যারে করার কোনও উপায় আছে?
গ্রেগ

আমি সরাসরি এটি করার কোনও উপায় সম্পর্কে অবগত নই at আপনাকে সম্ভবত ম্যানুয়ালি Splitএটির পুনরাবৃত্তি করতে হবে এবং এটিকে অ্যারেতে সেট করতে হবে। অবশ্যই এর অর্থ হ'ল প্রতিটি বিভক্ত আইটেমের সংখ্যা অবশ্যই সমান হতে হবে যেহেতু অ্যারেগুলি নির্দিষ্ট আকারের হয় এবং আপনার আগে অ্যারে সংজ্ঞায়িত করতে হবে। আমি ধারণা করি এটি কেবল একটি তৈরির চেয়ে আরও বেশি সমস্যা হতে পারে Vec
নম

উত্তর:


158

ব্যবহার split()

let mut split = "some string 123 ffd".split("123");

এটি একটি পুনরুক্তি দেয়, যা আপনি লুপ উপর, বা collect()একটি ভেক্টর মধ্যে করতে পারেন ।

for s in split {
    println!("{}", s)
}
let vec = split.collect::<Vec<&str>>();
// OR
let vec: Vec<&str> = split.collect();

15
আপনি এটি লিখতে পারেন .collect::<Vec<_>>()
ক্রিস মরগান

আমি কীভাবে ফলাফলটির দৈর্ঘ্য পেতে পারি - let split? split.len()অস্তিত্ব নেই
レ ッ ク

5
@AlexanderSupertramp ব্যবহারের .count()len()কেবলমাত্র পুনরাবৃত্তকারীদের জন্য যারা খাওয়ার প্রয়োজন ছাড়াই তাদের সঠিক আকারটি জানে, count()পুনরুক্তি গ্রহণ করে।
মণীশার্থ

error: cannot borrow immutable local variable বিভাজক হিসাবে রূপান্তরিত
レ ッ ク ス

let mut splitদুঃখিত, আলেকজান্ডারসুপারট্র্যাম্প
মণিশারথ

53

তিনটি সহজ উপায় আছে:

  1. বিভাজক দ্বারা :

    s.split("separator")  |  s.split('/')  |  s.split(char::is_numeric)
  2. হোয়াইটস্পেস দ্বারা :

    s.split_whitespace()
  3. দ্বারা নতুন লাইন :

    s.lines()

প্রতিটি ধরণের ফলাফল একটি পুনরাবৃত্তিকারী:

let text = "foo\r\nbar\n\nbaz\n";
let mut lines = text.lines();

assert_eq!(Some("foo"), lines.next());
assert_eq!(Some("bar"), lines.next());
assert_eq!(Some(""), lines.next());
assert_eq!(Some("baz"), lines.next());

assert_eq!(None, lines.next());

29

একটা বিশেষ পদ্ধতি splitstruct জন্যString :

fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a>

চর দ্বারা বিভক্ত:

let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);

স্ট্রিং দ্বারা বিভক্ত:

let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);

বন্ধ করে বিভক্ত করুন:

let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect();
assert_eq!(v, ["abc", "def", "ghi"]);

14

splitএকটি ফেরৎ Iterator, যা আপনি একটি মধ্যে রূপান্তর করতে পারেন Vecব্যবহার collect: split_line.collect::<Vec<_>>()Vecসরাসরি ফেরার পরিবর্তে পুনরাবৃত্তির মাধ্যমে যাওয়ার বিভিন্ন সুবিধা রয়েছে:

  • splitঅলস এর অর্থ হ'ল এটি আপনার প্রয়োজন না হওয়া অবধি সত্যই রেখাটিকে বিভক্ত করবে না। এই ভাবে এটা সময় বিভাজন অপচয় না পুরো স্ট্রিং আপনি শুধুমাত্র প্রথম কয়েক মান প্রয়োজন: split_line.take(2).collect::<Vec<_>>(), অথবা এমনকি আপনি শুধুমাত্র প্রথম মান যে একটি পূর্ণসংখ্যা রূপান্তরিত করা করতে পারে এমন: split_line.filter_map(|x| x.parse::<i32>().ok()).next()। এই শেষ উদাহরণটি "২৩.০" প্রসেস করার চেষ্টা করে সময় নষ্ট করবে না তবে "1" খুঁজে পাওয়ার সাথে সাথে তা প্রক্রিয়াজাতকরণ বন্ধ করবে।
  • splitআপনি যেভাবে ফলাফলটি সংরক্ষণ করতে চান তাতে কোনও অনুমান করে না। আপনি একটি ব্যবহার করতে পারেন Vec, কিন্তু আপনি কিছু ব্যবহার করতে পারে কার্যকরী FromIterator<&str>, উদাহরণস্বরূপ একটি জন্য LinkedListবা VecDeque, বা কোনো কাস্টম যে ধরনের কার্যকরী FromIterator<&str>

1
আপনার বিস্তারিত উত্তরের জন্য আপনাকে ধন্যবাদ, কোনও ধারণা কেন let x = line.unwrap().split(",").collect::<Vec<_>>();এটি কাজ করে না যদি না এটি দুটি পৃথক লাইনে বিভক্ত হয়: let x = line.unwrap();এবং let x = x.split(",").collect::<Vec<_>>();? ত্রুটির বার্তাটি বলে:temporary value created here ^ temporary value dropped here while still borrowed
গ্রেগ

তবে এটি যদি আমি ব্যবহার করি প্রত্যাশার মতো কাজ করেlet x = line.as_ref().unwrap().split(",").collect::<Vec<_>>();
গ্রেগ

6

এছাড়াও আছে split_whitespace()

fn main() {
    let words: Vec<&str> = "   foo   bar\t\nbaz   ".split_whitespace().collect();
    println!("{:?}", words);
    // ["foo", "bar", "baz"] 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.