正则表达式在 Dart 中第一个位置之后的所有字符

Regex all character after first position in Dart

我正在尝试从 John Doe 字符串实现此 J*** D**,但我当前的代码输出是 **** ***。 这是我当前的代码:

void main() {
  String txt = 'John Doe';
  String hideStr = txt.replaceAll(RegExp(r'\S'), '*');
  print(hideStr);
}

有什么建议吗?

您可以使用

String hideStr = txt.replaceAll(RegExp(r'(?<=\S)\S'), '*');

regex demo详情:

  • (?<=\S) - 在当前位置
  • 之前需要一个 non-whitespace 字符
  • \S - 一个空白字符。

一个non-lookbehind的解决方案也是可以的:

String hideStr = txt.replaceAllMapped(RegExp(r'(\S)(\S*)'), 
    (Match m) => "${m[1]}${'*' * (m[2]?.length ?? 0)}");

详情:

  • (\S)(\S*) 正则表达式匹配并捕获到第 1 组一个 non-whitespace 字符,然后零个或多个空白字符被捕获到第 2 组
  • ${m[1]}${'*' * (m[2]?.length ?? 0)} 替换是串联
    • ${m[1]} - 第 1 组值
    • ${'*' * (m[2]?.length ?? 0)} - * 字符重复第 2 组长度的时间。 ?? 0 是必要的,因为 m[2]?.length returns 一个可为 null 的 int)。

您可以使用负向后视来排除开头和 white-space

之后的字符
void main() {
    String txt = 'John Doe';
    String hideStr = txt.replaceAll(RegExp(r'(?<!^|\s)[^\s]'), '*');
    print(hideStr);
}

因为“J”和“D”位于文本开头和 space 之后,正则表达式不会匹配它