pub trait StrPattern {
fn find_in(&self, haystack: &str) -> Option<(usize, usize)>;
}
impl StrPattern for char {
#[inline]
fn find_in(&self, haystack: &str) -> Option<(usize, usize)> {
haystack.find(*self).map(|pos| (pos, self.len_utf8()))
}
}
impl StrPattern for &str {
#[inline]
fn find_in(&self, haystack: &str) -> Option<(usize, usize)> {
haystack.find(self).map(|pos| (pos, self.len()))
}
}
impl StrPattern for &String {
#[inline]
fn find_in(&self, haystack: &str) -> Option<(usize, usize)> {
haystack.find(self.as_str()).map(|pos| (pos, self.len()))
}
}
impl StrPattern for String {
#[inline]
fn find_in(&self, haystack: &str) -> Option<(usize, usize)> {
haystack.find(self.as_str()).map(|pos| (pos, self.len()))
}
}
pub trait StringExentd {
fn sub_char(&self, start_index: usize, len: usize) -> String;
fn split_char2<P: StrPattern>(&self, lable: P) -> (String, String);
fn split_char<P: StrPattern + Clone>(&self, lable: P) -> Vec<String>;
#[deprecated(note = "请使用 split_char 方法")]
fn split_arr<P: StrPattern + Clone>(&self, lable: P) -> Vec<String>{
self.split_char(lable)
}
#[deprecated(note = "请使用 split_char2 方法")]
fn split_two<P: StrPattern>(&self, lable: P) -> (String, String) {
self.split_char2(lable)
}
}
impl<T: AsRef<str>> StringExentd for T {
fn sub_char(&self, start_index: usize, len: usize) -> String {
let value = self.as_ref();
let v_len = value.chars().count();
if v_len < start_index + len {
return String::new();
}
let t = value.chars().into_iter().map(|x| x.to_string()).collect::<Vec<_>>();
if len > t.len() {
return "".to_owned();
}
let r: String = t[start_index..start_index + len].concat();
return r;
}
fn split_char2<P: StrPattern>(&self, lable: P) -> (String, String) {
let value = self.as_ref();
let value_len = value.len();
let (index, lable_len) = match lable.find_in(value) {
None => return (value.to_string(), String::new()),
Some(v) => v,
};
let index_start = index;
let lable_end = index + lable_len;
let r: String = value[0..index_start].to_string();
let r2: String = value[lable_end..value_len].to_string();
(r, r2)
}
fn split_char<P: StrPattern + Clone>(&self, lable: P) -> Vec<String> {
let value = self.as_ref();
let mut arr = vec![];
let (s1, s2) = value.split_char2(lable.clone());
arr.push(s1);
if s2.as_str() != "" {
let mut arr2 = s2.split_char(lable);
arr.append(&mut arr2);
}
arr
}
}
#[test]
fn test_old_sub_char() {
let s = String::from("测试获得bytes");
let expected_bytes = "测试获得bytes".as_bytes();
assert_eq!(s.as_bytes(), expected_bytes);
let a = "郭达b欢迎你";
let v = a.sub_char(2, 1);
assert_eq!(v, "b");
let a = "郭达好欢迎你";
let v = a.sub_char(2, 1);
assert_eq!(v, "好");
let a = "郭达欢迎你,查找一个找不到的中文字符";
let v = a.split_char2("好");
assert_eq!(v, (a.to_string(), String::new()));
let a = "郭达欢迎你,查找一个找不到的英文字符呀";
let v = a.split_char2("e");
assert_eq!(v, (a.to_string(), String::new()));
let a = "郭达欢迎你,ab查找一个英文字符串";
let v = a.split_char2(",ab");
assert_eq!(v, ("郭达欢迎你".to_string(), "查找一个英文字符串".to_string()));
let a = "郭达欢迎你abc,你好查找一个中文字符串";
let v = a.split_char2("你好");
assert_eq!(v, ("郭达欢迎你abc,".to_string(), "查找一个中文字符串".to_string()));
let a = "郭达abc欢迎你,查找一个中英混和字符串";
let v = a.split_char2("abc欢迎你,");
assert_eq!(v, ("郭达".to_string(), "查找一个中英混和字符串".to_string()));
}
#[test]
fn test_sub_char() {
let a = "abcdef";
let v = a.sub_char(0, 2);
assert_eq!(v, "ab");
let a = "郭达abc欢迎你";
let v = a.sub_char(0, 2);
assert_eq!(v, "郭达");
let v = String::from("郭达abc欢迎你").sub_char(0, 3);
assert_eq!(v, "郭达a");
}
#[test]
fn test_split_char2() {
let a = "abcd ef";
let v = a.split_char2("c");
assert_eq!(v, ("ab".to_string(), "d ef".to_string()));
let a = "郭达 欢迎你";
let v = a.split_char2(" ");
assert_eq!(v, ("郭达".to_string(), "欢迎你".to_string()));
let a = "郭达 欢迎你";
let v = a.split_char2(' ');
assert_eq!(v, ("郭达".to_string(), "欢迎你".to_string()));
let a = "郭达欢迎你";
let v = a.split_char2("欢迎");
assert_eq!(v, ("郭达".to_string(), "你".to_string()));
let a = "郭达欢迎你";
let v = a.split_char2("欢迎fd");
assert_eq!(v, (a.to_string(), String::new()));
let a = "郭达欢迎q你";
let v = a.split_char2("欢迎q");
assert_eq!(v, ("郭达".to_string(), "你".to_string()));
let a = "hello-world";
let v = a.split_char2('-');
assert_eq!(v, ("hello".to_string(), "world".to_string()));
let a = "key:value";
let v = a.split_char2(':');
assert_eq!(v, ("key".to_string(), "value".to_string()));
let a = "name=张三";
let v = a.split_char2('=');
assert_eq!(v, ("name".to_string(), "张三".to_string()));
let a = "path/to/file";
let v = a.split_char2('/');
assert_eq!(v, ("path".to_string(), "to/file".to_string()));
let a = "你好,世界";
let v = a.split_char2(',');
assert_eq!(v, ("你好".to_string(), "世界".to_string()));
let a = "苹果、香蕉、橘子";
let v = a.split_char2('、');
assert_eq!(v, ("苹果".to_string(), "香蕉、橘子".to_string()));
let a = "姓名:李四";
let v = a.split_char2(':');
assert_eq!(v, ("姓名".to_string(), "李四".to_string()));
let a = "前的后";
let v = a.split_char2('的');
assert_eq!(v, ("前".to_string(), "后".to_string()));
let a = "没有分隔符";
let v = a.split_char2('x');
assert_eq!(v, (a.to_string(), String::new()));
let a = "没有这个字";
let v = a.split_char2('啊');
assert_eq!(v, (a.to_string(), String::new()));
}
#[test]
fn test_split_arr() {
let a = "abcdef";
let v = a.split_char("c");
assert_eq!(v, vec!["ab".to_string(), "def".to_string()]);
let a = "郭,达欢,迎你,";
let v = a.split_char(",");
assert_eq!(v, vec!["郭".to_string(), "达欢".to_string(), "迎你".to_string()]);
}
#[test]
fn test_split_with_char() {
let a = "abc,def,ghi";
let v = a.split_char(',');
assert_eq!(v, vec!["abc".to_string(), "def".to_string(), "ghi".to_string()]);
let a = "郭达,欢迎,你";
let v = a.split_char(',');
assert_eq!(v, vec!["郭达".to_string(), "欢迎".to_string(), "你".to_string()]);
let a = "hello world";
let v = a.split_char2(' ');
assert_eq!(v, ("hello".to_string(), "world".to_string()));
let a = "郭达好欢迎你";
let v = a.split_char2('好');
assert_eq!(v, ("郭达".to_string(), "欢迎你".to_string()));
let a = "abcdef";
let v = a.split_char2('x');
assert_eq!(v, ("abcdef".to_string(), String::new()));
}