Dart regex:如何用大写字母替换匹配的子字符串?

yhqotfr8  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(101)

将所有以下划线开头的小写字母替换为大写字母。例如,在一个实施例中,

hello_world --> helloWorld
hello --> hello
today_is_monday -> todayIsMonday
vhmi4jdf

vhmi4jdf1#

小心地定义你想要的东西(包括你不想要的东西)。
_后面的每个小写字母都应该大写吗?或者只有_前面有字母的字母才应该大写吗?也就是说,"_foo"应该变成"Foo"吗?
让我们假设你正在把蛇的情况翻译成 Camel 的情况。
那么我可能仍然会使用RegExp,您的问题的答案是replaceAllMapped

// 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”)替换,因为其他字母前面没有下划线,或者下划线前面没有字母或数字。

hgqdbh6s

hgqdbh6s2#

您可以将replaceAllMapped函数与正则表达式结合使用,以获取组并对其进行修改。

void main() {
  const one = "hello_world";
  const two = "hello";
  const three = "today_is_monday";
  
  final regex = RegExp('_([a-z])');
  
  final oneResult = one.replaceAllMapped(regex, replaceUpperCase);
  final twoResult = two.replaceAllMapped(regex, replaceUpperCase);
  final threeResult = three.replaceAllMapped(regex, replaceUpperCase);
  
  print(oneResult);
  print(twoResult);
  print(threeResult);
}

String replaceUpperCase(Match match) {
  return match[1]?.toUpperCase() ?? match[0]!;
}
Output:
helloWorld
hello
todayIsMonday

相关问题