使用Dart将PascalCase字符串分成单独的单词?

时间:2018-12-11 06:24:22

标签: regex dart flutter

我有一个单词HelloWorld,我想拆分为HelloWorld,所以我该如何在Dart中做到这一点?

目前,我有-

String str = 'HelloWorld';

我不知道该怎么走?

我尝试过RegExp

words = str.split(new RegExp(r"[A-Z]"));

但是它不起作用。如何分隔HelloWorld

3 个答案:

答案 0 :(得分:2)

您要在大写字母前分割,但第一个字母除外。 只需将大写字母拆分(至少,ASCII字母)即可:

// Single character look-ahead for capital letter.
final beforeCapitalLetter = RegExp(r"(?=[A-Z])");
...
var parts = string.split(beforeCapitalLetter);

这里的问题是它也会在第一个字母之前拆分,从而在结果部分中为您提供一个空的第一个元素。 如果您确定它在那里,则可以将其删除。

if (parts.isNotEmpty && parts[0].isEmpty) parts = parts.sublist(1);

或者,您可以通过RegExp变得更聪明:

// Matches before a capital letter that is not also at beginning of string.
final beforeNonLeadingCapitalLetter = RegExp(r"(?=(?!^)[A-Z])");
List<String> splitPascalCase(String input) =>
    input.split(beforeNonLeadingCapitalLetter);

示例结果:

print(splitPascalCase("HelloWorld"));  // [Hello, World]
print(splitPascalCase("One")); // [One]
print(splitPascalCase("none")); // [none]
print(splitPascalCase("BFG9000")); // [B, F, G9000]
print(splitPascalCase("XmlHTTPRequest")); // [Xml, H, T, T, P, Request]

(您可能要考虑最后一件事是否就是您想要的)。

另一种选择是不分割,而是匹配您想要的部分。

final pascalWords = RegExp(r"(?:[A-Z]+|^)[a-z]*");
List<String> getPascalWords(String input) =>
    pascalWords.allMatches(input).map((m) => m[0]).toList();

这将提取所有以一个或多个开头大写字母开头(或字符串开头)的单词。如果您的字符串仅包含字母,则其功能应与上一个功能相同。如果其中包含其他内容,则将忽略这些内容。

print(getPascalWords("BFG9000")); // [BFG]
print(getPascalWords("XmlHTTPRequest")); // [Xml, HTTPRequest]

哪个更喜欢取决于您希望输入的字符串以及要如何处理小写字母:相邻的大写字母?所有大写字母?空字符串?

如果它始终是一个或多个两个字母或更长的单词的首字母大写的串联,那么这只是简单的情况,并且任何一种方法都行得通。

答案 1 :(得分:1)

您可以尝试

   var value= 4;
 Numbers enumDisplayStatus = (Numbers)value;
    string stringValue = enumDisplayStatus.ToString();
  

说明

  • r"(?<=[a-z])(?=[A-Z])" -向后看。匹配任何小写字母。
  • (?<=[a-z])-正向超前。匹配所有大写字母。

    (?=[A-Z])

打印-> [Hello,World];

答案 2 :(得分:1)

来自https://pub.dartlang.org/packages/recase

titleCase 提供(除其他外)

var recase = ReCase(str);
print(recase.titleCase);