正则表达式替换除第一个“和最后一个”

时间:2018-10-23 21:14:02

标签: regex dart flutter

我需要一个正则表达式来替换所有内容,除了第一个“和最后一个”之间的内容。

我需要这样:

输入字符串:["Key:"Value""]

在正则表达式之后,我只需要这个:

输出字符串:Key:"Value"

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情。

样式:
^.*?"(.*)".*$

订阅:
$1

On Regex101

经验:

第一部分^.*?"匹配字符串开头和双引号之间的尽可能少的字符

第二部分(.*)"进行最大的匹配,并以双引号结尾,并将其全部填充到捕获组中

最后一部分.*$抓住剩下的所有东西并将其包括在比赛中

最后,将整个匹配项替换为第一个捕获组的内容

答案 1 :(得分:1)

您能说说为什么需要 RegExp 吗? 像这样的功能:

String unquote(String input) {
  int start = input.indexOf('"');
  if (start < 0) return input; // or throw.
  int end = input.lastIndexOf('"');
  if (start == end) return input; // or throw
  return input.substring(start + 1, end);
}

比RegExp更快更容易理解。

无论如何,对于挑战来说,我们确实希望有一个RegExp可以用零来替换直到第一个"以及最后一个"为止的部分。这是两个替换项,因此您可以执行

input.replaceAll(RegExp(r'^[^"]*"|"[^"]*$'), "")`

或者您可以使用捕获组和计算的替代值,例如:

input.replaceFirstMapped(RegExp(r'^[^"]*"([^]*)"[^"]*$'), (m) => m[1])

或者,您可以使用捕获组在两个文本之间选择,并将其提取为代码,而不用替换字符串:

String unquote(String input) {
  var re = RegExp(r'^[^"]*"([^]*)"[^"]$');
  var match = re.firstMatch(input);  
  if (match == null) return input; // or throw.
  return match[1];
}