// RegExp matching a lower case letter preceded by
// lower-case-letter-or-digit then underscore.
final _snakeRE = RegExp(r"(?<=[a-z\d])_([a-z])");
String snakeToCamelCase(String input) =>
input.replaceAllMapped(_snakeRE, (m) => m[1]!.toUpperCase());
RegExp (?<=[a-z\d])_([a-z])使用 look-behind((?<=...))来匹配下划线和小写字母(_([a-z])),仅当它跟在小写字母或数字([a-z\d])之后时。后向查找不是匹配字符串的一部分,因此仅匹配下面的下划线和小写字母。这很重要,因为匹配是replaceAllMapped函数所取代的。 这意味着在"a b cd _e_f 9_g"中,只有“_f”和“_g”将被匹配,并被函数大写的字母(“F”和“G”)替换,因为其他字母前面没有下划线,或者下划线前面没有字母或数字。
2条答案
按热度按时间vhmi4jdf1#
小心地定义你想要的东西(包括你不想要的东西)。
_
后面的每个小写字母都应该大写吗?或者只有_
前面有字母的字母才应该大写吗?也就是说,"_foo"
应该变成"Foo"
吗?让我们假设你正在把蛇的情况翻译成 Camel 的情况。
那么我可能仍然会使用RegExp,您的问题的答案是
replaceAllMapped
。RegExp
(?<=[a-z\d])_([a-z])
使用 look-behind((?<=...)
)来匹配下划线和小写字母(_([a-z])
),仅当它跟在小写字母或数字([a-z\d]
)之后时。后向查找不是匹配字符串的一部分,因此仅匹配下面的下划线和小写字母。这很重要,因为匹配是replaceAllMapped
函数所取代的。这意味着在
"a b cd _e_f 9_g"
中,只有“_f”和“_g”将被匹配,并被函数大写的字母(“F”和“G”)替换,因为其他字母前面没有下划线,或者下划线前面没有字母或数字。hgqdbh6s2#
您可以将replaceAllMapped函数与正则表达式结合使用,以获取组并对其进行修改。