dea*_*904 4 regex dart flutter
我有一个词HelloWorld想要拆分为Hello&World那么我如何在 Dart 中做到这一点?
目前,我有 -
String str = 'HelloWorld';
Run Code Online (Sandbox Code Playgroud)
我不知道如何走得更远?
我试过RegExp像
words = str.split(new RegExp(r"[A-Z]"));
Run Code Online (Sandbox Code Playgroud)
但它不起作用。我如何分离Hello& World?
您想在大写字母前拆分,第一个除外。只需拆分大写字母(好吧,至少是 ASCII 字母)很容易:
// Single character look-ahead for capital letter.
final beforeCapitalLetter = RegExp(r"(?=[A-Z])");
...
var parts = string.split(beforeCapitalLetter);
Run Code Online (Sandbox Code Playgroud)
这里的问题是它也在第一个字母之前分裂,在结果部分给你一个空的第一个元素。如果您确定它在那里,您可以删除它。
if (parts.isNotEmpty && parts[0].isEmpty) parts = parts.sublist(1);
Run Code Online (Sandbox Code Playgroud)
或者,您可以巧妙地使用 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);
Run Code Online (Sandbox Code Playgroud)
结果示例:
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]
Run Code Online (Sandbox Code Playgroud)
(您可能需要考虑最后一件事是否是您想要的)。
另一种选择是不split,而是匹配您想要的部分。
final pascalWords = RegExp(r"(?:[A-Z]+|^)[a-z]*");
List<String> getPascalWords(String input) =>
pascalWords.allMatches(input).map((m) => m[0]).toList();
Run Code Online (Sandbox Code Playgroud)
这将提取以一个或多个前导大写字母(或字符串开头)开头的所有单词。如果您的字符串仅包含字母,则它的作用与前一个函数大致相同。如果它包含其他内容,则忽略这些内容。
print(getPascalWords("BFG9000")); // [BFG]
print(getPascalWords("XmlHTTPRequest")); // [Xml, HTTPRequest]
Run Code Online (Sandbox Code Playgroud)
更喜欢哪一个取决于您希望获得哪些字符串作为输入,以及您希望如何处理边缘情况:相邻的大写字母?全部大写?空字符串?
如果它总是连接一个或多个两个字母或更长的单词,第一个字母大写,那么这只是简单的情况,任何一种方法都可以使用。
编辑:自从首次发布以来,Dart RegExps 已开始支持后视。有了这个,也可以通过在小写字母和大写字母之间进行拆分来使用 split ,正如Serdnad在评论中所说:
// Single character look-ahead for capital letter.
final beforeCapitalLetter = RegExp(r"(?=[A-Z])");
...
var parts = string.split(beforeCapitalLetter);
Run Code Online (Sandbox Code Playgroud)
这在小写字母之后和大写字母之前分开。
你可以试试这个
r"(?<=[a-z])(?=[A-Z])"
Run Code Online (Sandbox Code Playgroud)
解释
(?<=[a-z])- 积极的后瞻。匹配任何小写字母。(?=[A-Z])- 正向前瞻。匹配任何大写字母。
void main() {
String str = 'HelloWorld';
var words = str.split(new RegExp(r"(?<=[a-z])(?=[A-Z])"));
print(words);
}
Run Code Online (Sandbox Code Playgroud)打印 -> [你好,世界];
| 归档时间: |
|
| 查看次数: |
2947 次 |
| 最近记录: |