Flutter/Dart:按第一次出现分割字符串

问题描述 投票:0回答:10

有没有办法通过一些符号分割字符串,但仅在第一次出现时?

示例

date: '2019:04:01'
应拆分为
date
'2019:04:01'

它也可能看起来像这样
date:'2019:04:01'
或这样
date   :   '2019:04:01'
,但仍应分为
date
'2019:04:01'

string.split(':');

我尝试使用

split()
方法。但它没有限制属性或类似的东西。

dart split
10个回答
46
投票

您永远无法使用 split 命令完成所有这些操作,包括修剪空格。你必须自己做。这是一种方法:

String s = "date   :   '2019:04:01'";
int idx = s.indexOf(":");
List parts = [s.substring(0,idx).trim(), s.substring(idx+1).trim()];

34
投票

您可以拆分字符串,跳过创建的列表的第一项,然后将它们重新连接到字符串中。

在你的情况下,它会是这样的:

var str = "date: '2019:04:01'";
var parts = str.split(':');
var prefix = parts[0].trim();                 // prefix: "date"
var date = parts.sublist(1).join(':').trim(); // date: "'2019:04:01'"

修剪方法删除第一个冒号周围任何不必要的空格。


10
投票

只需在字符串上使用 split 方法即可。它接受分隔符/分隔符/模式来分割文本。它返回由提供的分隔符/分隔符/模式分隔的值列表。

用途:

const str = 'date: 2019:04:01';
final values = string.split(': '); // Notice the whitespace after colon

输出:


5
投票

受到 python 的启发,我编写了这个实用函数来支持字符串

split
以及可选的最大分割数。用途:

split("a=b=c", "="); // ["a", "b", "c"]
split("a=b=c", "=", max: 1); // ["a", "b=c"]
split("",""); // [""] (edge case where separator is empty)
split("a=", "="); // ["a", ""]
split("=", "="); // ["", ""]
split("date: '2019:04:01'", ":", max: 1) // ["date", " '2019:04:01'"] (as asked in question)

在代码中定义此函数:

List<String> split(String string, String separator, {int max = 0}) {
  var result = List<String>();

  if (separator.isEmpty) {
    result.add(string);
    return result;
  }

  while (true) {
    var index = string.indexOf(separator, 0);
    if (index == -1 || (max > 0 && result.length >= max)) {
      result.add(string);
      break;
    }

    result.add(string.substring(0, index));
    string = string.substring(index + separator.length);
  }

  return result;
}

在线演示:https://dartpad.dev/e9a5a8a5ff803092c76a26d6721bfaf4


4
投票

我发现通过删除第一项并“加入”列表的其余部分非常简单

String date = "date:'2019:04:01'";
List<String> dateParts = date.split(":");
List<String> wantedParts = [dateParts.removeAt(0),dateParts.join(":")];

2
投票

使用正则表达式

string.split(RegExp(r":\s*(?=')"));
  1. 注意原始字符串的使用(以 r 为前缀的字符串)
  2. \s*
    匹配零个或多个空白字符
  3. (?=')
    匹配
    '
    但不包含其自身

2
投票

您可以使用扩展并使用此扩展来分隔 RichText/TextSpan 用例的文本:

extension StringExtension on String {
 List<String> controlledSplit(
  String separator, {
  int max = 1,
  bool includeSeparator = false,
  }) {
   String string = this;
   List<String> result = [];

   if (separator.isEmpty) {
     result.add(string);
     return result;
   }

   while (true) {
     var index = string.indexOf(separator, 0);
     print(index);
     if (index == -1 || (max > 0 && result.length >= max)) {
       result.add(string);
       break;
     }

     result.add(string.substring(0, index));
     if (includeSeparator) {
       result.add(separator);
     }
     string = string.substring(index + separator.length);
   }

   return result;
 }
}

然后您可以通过该扩展名将其引用为任何字符串的方法:

void main() {
 String mainString = 'Here was john and john was here';
 print(mainString.controlledSplit('john', max:1, includeSeparator:true));
}

0
投票

只需将列表转换为字符串并搜索

  productModel.tagsList.toString().contains(filterText.toLowerCase())

0
投票

只需在字符串上写一个扩展

extension StringExtension on String {
(String, String) splitFirst({String separator = ":"}) {
 int separatorPosition = indexOf(separator);
 if (separatorPosition == -1) {
  return (this, "");
 }
 return (substring(0, separatorPosition), substring(separatorPosition + separator.length));
}}

然后像这样使用它

final (firstPart, secondPart) = yourString.splitFirst();

0
投票
void main() {
   var str = 'date: 2019:04:01';
   print(str.split(" ").last.trim()); //2019:04:01
}
© www.soinside.com 2019 - 2024. All rights reserved.