正则表达式在 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 之后,正则表达式不会匹配它
我正在尝试从 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 之后,正则表达式不会匹配它