首页 > 解决方案 > Dart - 使用正则表达式拆分字符串并保留分隔符

问题描述

我有以下字符串:

final String text = """
This is first text <link="www.stackoverflow.com">First Hello</link>
This is the second text <link="www.stackoverflow.com">Second</link>
"""

我想拆分字符串并得到以下结果:

[
"This is first text ", 
"<link="www.stackoverflow.com">First Hello</link>", 
"This is the second text ", 
"<link="www.stackoverflow.com">Second</link>"
]

我尝试使用这个正则表达式,但它不像预期的那样:

(?<=<link=".*">)|(?=</link>)

这是结果:

在此处输入图像描述

我可以使用正则表达式这样拆分吗?正则表达式格式如何?

谢谢你。

标签: regexdart

解决方案


你很近。尝试:

var re = RegExp(r'(?=<link=".*?">)|(?<=</link>)');

它与您的 RegExp 有两个不同之处:

  • 它交换(?=and因为你想要在 a之前进行(?<=拆分,所以你想要向前看,在 a 之后所以向后看。<link...></link>
  • 我添加了?to ".*?",因为否则它可能会匹配到"同一行的稍后,而不是第一个。你的例子没有,但比抱歉更安全。

有了它,你得到了字符串:

  1. "This is first text "
  2. "<link=\"www.stackoverflow.com\">First Hello</link>"
  3. "\nThis is the second text "
  4. "<link=\"www.stackoverflow.com\">Second</link>"
  5. "\n"

如果您不希望包含换行符,您可能应该先删除它们。

如果您想将 与 结合起来\n</link>您可以将 RegExp 更改为

var re = RegExp(r'(?=<link=".*?">)|(?<=</link>\n*(?<=\n))');

这给了你:

  1. "This is first text "
  2. "<link=\"www.stackoverflow.com\">First Hello</link>\n"
  3. "This is the second text "
  4. "<link=\"www.stackoverflow.com\">Second</link>\n"

推荐阅读