Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex dart:使用正则表达式拆分字符串并包含分隔符_Regex_Dart - Fatal编程技术网

Regex dart:使用正则表达式拆分字符串并包含分隔符

Regex dart:使用正则表达式拆分字符串并包含分隔符,regex,dart,Regex,Dart,在Dart中,我希望使用正则表达式拆分字符串,并在结果列表中包含匹配的分隔符。因此,使用分隔符,我希望字符串123.456.789被拆分为[123,456,789] 在一些语言中,如C#、JavaScript、Python和Perl,根据,这可以通过简单地在捕获括号中包含分隔符来实现。这一行为似乎已被记录在案 但是,这在Dart中似乎不起作用: print(“123.456.789”).split(新RegExp(r“(\”)))) 产生与不带括号完全相同的结果。有没有办法让split()在Da

在Dart中,我希望使用正则表达式拆分字符串,并在结果列表中包含匹配的分隔符。因此,使用分隔符
,我希望字符串
123.456.789
被拆分为
[123,456,789]

在一些语言中,如C#、JavaScript、Python和Perl,根据,这可以通过简单地在捕获括号中包含分隔符来实现。这一行为似乎已被记录在案

但是,这在Dart中似乎不起作用:

print(“123.456.789”).split(新RegExp(r“(\”))))

产生与不带括号完全相同的结果。有没有办法让
split()
在Dart中像这样工作?否则,我想它将必须是一个
allMatches()
实现

编辑:在单个分隔符上放置
(?拆分
给定初始字符串:

123.456.789
和预期结果(按分隔符拆分并包括分隔符):

您可以使用以下正则表达式:

(?!^|$)\b
匹配与单词边界匹配的位置,但行的起点/终点除外


在多个分隔符上拆分 现在进行编辑,给定以下字符串:

123.456.789;abc;.xyz.;ABC
您希望得到预期的结果(拆分为并包括多个分隔符):

您可以使用以下正则表达式(改编自第一个添加的替换):

(为了显示,我使用换行符替换来模拟拆分)

下列工作之一

(?!^|$)\b|(?!\w)\B(?!\w)
(?!^|$)\b|(?=\W)\B(?=\W)

# the long way (with case-insensitive matching) - allows underscore _ as delimiter
(?!^|$)(?:(?<=[a-z\d])(?![a-z\d])|(?<![a-z\d])(?=[a-z\d])|(?<![a-z\d])(?![a-z\d]))
(?!^$)\b(?!\w)\b(?!\w)
(?!^ |$)\b |(?=\W)\b(?=\W)
#long-way(不区分大小写的匹配)-允许下划线作为分隔符
(?!^|$)(?:(?
匹配与单词边界匹配的位置(行的开头/结尾除外);或匹配与单词边界不匹配但前面或后面有非单词字符的位置


注意:这将在Dart 2.3.0及更高版本中起作用,因为添加了lookback支持()。

标准库中没有对它的直接支持,但基于
RegExp.allMatches()
推出您自己的实现非常简单。例如:

extension RegExpExtension on RegExp {
  List<String> allMatchesWithSep(String input, [int start = 0]) {
    var result = <String>[];
    for (var match in allMatches(input, start)) {
      result.add(input.substring(start, match.start));
      result.add(match[0]);
      start = match.end;
    }
    result.add(input.substring(start));
    return result;
  }
}

extension StringExtension on String {
  List<String> splitWithDelim(RegExp pattern) =>
      pattern.allMatchesWithSep(this);
}

void main() {
  print("123.456.789".splitWithDelim(RegExp(r"\.")));
  print(RegExp(r" ").allMatchesWithSep("lorem ipsum dolor sit amet"));
}
RegExp上的扩展名regexpxtension{ 列出所有MatchesWithSep(字符串输入,[int start=0]){ var结果=[]; for(所有匹配中的var匹配(输入,开始)){ 添加(input.substring(start,match.start)); 结果。添加(匹配[0]); 开始=匹配。结束; } 结果.添加(输入.子字符串(开始)); 返回结果; } } 扩展字符串字符串上的扩展{ 列表splitWithDelim(RegExp模式)=> 模式。所有与步骤匹配(此); } void main(){ 打印(“123.456.789”。拆分为delim(RegExp(r“\”)))); 打印(RegExp(r“)。所有与SEP匹配(“lorem ipsum dolor sit amet”); }
上拆分(?!^ |$)\b
分隔符并不总是
-它可能是一组表达式中的一个。这很好,我没有指定
,它将在单词边界位置上拆分
123.456.789;abc;.xyz;.abc
?您需要为它编写一个自定义方法,String.split不允许在Dart中使用此方法。非常好-I didn不知道扩展。这很符合要求。可能需要检查某些地方是否有空字符串,例如在
输入的最后部分添加时,但这取决于应用程序。谢谢。(以下内容对于了解regexps的人来说是显而易见的)例如,如果您有不同的可能分隔符,如
'.
':'
,则需要使用regexp,如
'[\.:]'
等。我希望允许由任何正则表达式拆分(由用户确定);带有
的示例只是一个示例。我不清楚这是否允许这样做。我在编辑中发布的look{ahead | behind}代码可以做到这一点,但性能我不清楚。
(?!^|$)\b|(?!\w)\B(?!\w)
(?!^|$)\b|(?=\W)\B(?=\W)

# the long way (with case-insensitive matching) - allows underscore _ as delimiter
(?!^|$)(?:(?<=[a-z\d])(?![a-z\d])|(?<![a-z\d])(?=[a-z\d])|(?<![a-z\d])(?![a-z\d]))
extension RegExpExtension on RegExp {
  List<String> allMatchesWithSep(String input, [int start = 0]) {
    var result = <String>[];
    for (var match in allMatches(input, start)) {
      result.add(input.substring(start, match.start));
      result.add(match[0]);
      start = match.end;
    }
    result.add(input.substring(start));
    return result;
  }
}

extension StringExtension on String {
  List<String> splitWithDelim(RegExp pattern) =>
      pattern.allMatchesWithSep(this);
}

void main() {
  print("123.456.789".splitWithDelim(RegExp(r"\.")));
  print(RegExp(r" ").allMatchesWithSep("lorem ipsum dolor sit amet"));
}