flutter 如何在Dart字符串中插入字符?

cgvd09ve  于 2023-06-07  发布在  Flutter
关注(0)|答案(7)|浏览(783)

我想在给定的位置向Dart String添加一些白色,就像this(在Java中)一样。
所以...

'XPTOXXSFXBAC' become 'XPTO XXSF XBAC'

有简单的方法吗?

gzjq41n4

gzjq41n41#

你可以使用StringreplaceAllMapped方法,你必须添加正则表达式,像这样:

final value =  "XPTOXXSFXBAC".replaceAllMapped(RegExp(r".{4}"), (match) => "${match.group(0)} ");
 print("value: $value");
lrl1mhuk

lrl1mhuk2#

var x= 'XPTOXXSFXBAC';
 x = x.substring(0, 4) + " " + x.substring(4, 8) + " " + x.substring(8, x.length);
 print(x) ;
fnx2tebb

fnx2tebb3#

有一个dart包提供了一些String操作的helper类。
Github:https://github.com/Ephenodrom/Dart-Basic-Utils使用以下命令安装:

dependencies:
  basic_utils: ^1.5.0

用途

String s = "";
s = StringUtils.addCharAtPosition("1234567890", "-", 3);
print(s); // "123-4567890"
s = StringUtils.addCharAtPosition("1234567890", "-", 3, repeat: true); 
print(s); // "123-456-789-0"
s = StringUtils.addCharAtPosition("1234567890", "-", 12);
print(s); // "1234567890"

其他信息:
这些都是StringUtils类中的方法。

String defaultString(String str, {String defaultStr = ''});
bool isNullOrEmpty(String s);
bool isNotNullOrEmpty(String s);
String camelCaseToUpperUnderscore(String s);
String camelCaseToLowerUnderscore(String s);
bool isLowerCase(String s);
bool isUpperCase(String s);
bool isAscii(String s);
String capitalize(String s);
String reverse(String s);
int countChars(String s, String char, {bool caseSensitive = true});
bool isDigit(String s);
bool equalsIgnoreCase(String a, String b);
bool inList(String s, List<String> list, {bool ignoreCase = false});
bool isPalindrome(String s);
String hidePartial(String s, {int begin = 0, int end, String replace = "*"});
String addCharAtPosition(String s, String char, int position,{bool repeat = false});
n6lpvg4x

n6lpvg4x4#

你的问题太具体了:你只是想插入字符(或字符串)到另一个 dart 字符串。空白并不特别。

方法一

String toSpaceSeparatedString(String s) {
  var start = 0;
  final strings = <String>[];
  while (start < s.length) {
    final end = start + 4;
    strings.add(s.substring(start, end));
    start = end;
  }
  return s.join(' ');
}

方法#2(效率较低)

String toSpaceSeparatedString(String s) {
  const n = 4;
  assert(s.length % n == 0);
  var i = s.length - n;
  while (i > 0) {
    s = s.replaceRange(i, i, ' ');
    i -= n;
  }
  return s;
}

方法#2效率较低(它需要重复插入到String中,因此涉及重复复制String的相同部分),并且更笨拙(它从String的末尾迭代到开头,以便索引稳定),并且有更多的角落情况(为了简单起见,我假设输入字符串可以被子串长度整除)。但是,我在这里包含它是因为它演示了如何使用String.replaceRange,这对于将一个String插入到另一个String中通常是有用的,而且对于一次性的情况可能更简单。

qf9go6mv

qf9go6mv5#

我有一个更简单的版本@diegoveloper的答案,使用allMatches。通过使用join,它不会成为额外的分隔符。

final myText = 'XPTOXXSFXBAC';
final separator = ' ';

final result = RegExp(r".{4}")
               .allMatches(myText)
               .map((e) => e.group(0))
               .join(separator);
mbzjlibv

mbzjlibv6#

用于在 dart 中显示卡号,如15XX XXXX XXXX 9876

String num1 = "1567456789099876".replaceAll(RegExp(r'(?<=.{2})\d(?=.{4})'), 'X');
String num  = num1.replaceAllMapped(RegExp(r".{4}"), (match) => "${match.group(0)} ");

print(num); //15XX XXXX XXXX 9876
lfapxunr

lfapxunr7#

在特定索引/位置插入字符串的最简单方法是使用范围长度为零的String.replaceRange()方法。

final newString = "My String".replaceRange(index, index, "insertion string");

为方便起见,可以使用以下扩展名:

extension InsertString on String {
  String insert(int index, String string) => replaceRange(index, index, string);
}

// Usage:
"test".insert(2, " "); // returns "te st"

相关问题