dart - 如何删除字符串中的前导0
问题描述
我得到包含前导零的字符串格式的 ID。我想保留这种字符串格式,但没有前导零。例子:
00 => 0
01 => 1
02 => 2
10 => 10
11 => 11
我当前的实现是 String id = int.parse(originalId).toString()
是否有更好/高效/ Dart 模式的方式来实现这种转换?
解决方案
您可以使用RegExp
which 可能比双重转换更丑但更快:
"01".replaceAll(new RegExp(r'^0+(?=.)'), '')
'^' 匹配字符串的开头
0+
匹配一个或多个0
字符
(=?.)
匹配()
除换行符 ( .
) 之外的任何字符的组 ( ),但不将其包含在结果 ( =?
) 中,这确保不会匹配整个字符串,因此如果只有零,我们至少保留一个零。
例子 :
void main() {
final List nums = ["00", "01", "02", "10", "11"];
final RegExp regexp = new RegExp(r'^0+(?=.)');
for (String s in nums) {
print("$s => ${s.replaceAll(regexp, '')}");
}
}
结果 :
00 => 0
01 => 1
02 => 2
10 => 10
11 => 11
编辑:性能测试感谢您的评论
void main() {
Stopwatch stopwatch = Stopwatch()..start();
final RegExp reg = RegExp(r'^0+(?=.)');
for (int i = 0; i < 20000000; i++) {
'05'.replaceAll(reg, '');
}
print('RegExp executed in ${stopwatch.elapsed}');
stopwatch = Stopwatch()..start();
for (int i = 0; i < 20000000; i++) {
int.parse('05').toString();
}
print('Double conversion executed in ${stopwatch.elapsed}');
}
结果 :
RegExp executed in 0:00:02.912000
Double conversion executed in 0:00:03.216000
与双重转换相比,您将执行的操作越多,效率越高。然而RegExp
,在单个计算中可能会更慢,因为创建它是有成本的,但我们谈论的是几微秒......我会说除非你有数以万计的操作,否则使用对你来说更方便。
推荐阅读
- javascript - 如果输入改变焦点的宽度,Vue @click 事件将不起作用
- reactjs - 笑话测试:使用 react propTypes / defaultProps 覆盖
- python - Python webdriverwait 或 expected_conditions 对我不起作用
- php - 裁剪/黑色背景问题
- reactjs - 没有输入文本时如何在反应选择中禁用加载动画
- 3d - Mapbox 3D 地形不透明度
- c# - Visual Studio 2019 - .NET Standard 项目兼容性警告
- java - Mediaplayer 播放列表 (ArrayList) 播放暂停无法正常工作
- php - 如何从 WP Job Manager Resumes 中删除评论部分?
- java - 运行 SoftAssert-java.lang.NoClassDefFoundError 的测试方法抛出错误:org/testng/asserts/SoftAssert