【问题标题】:Create String.Format like string and extract sub string像字符串一样创建 String.Format 并提取子字符串
【发布时间】:2016-02-17 04:50:34
【问题描述】:

首先,我想从分隔符之间的字符串中提取子字符串到参数中,并使字符串变得像String.Format的字符串。

示例

来源:

<Hello> [World]!

输出:

结果字符串

<{0}> [{1}]!

数组中提取的参数

0: Hello
1: World

有很多字符串包含未知数量的参数。此外,还有两种分隔符:&lt;&gt;[]

我使用正则表达式搜索字符串提取示例,但其中大多数基于静态字符串格式。但是,字符串的格式是未知的,在这种情况下可能包含也可能不包含任何分隔符。

编辑: 定界符有可能被其他定界符换行,但定界符总是成对出现。

示例

来源:

[<Hello> World]!

输出:

结果字符串

[{0}]!

数组中提取的参数

0: <Hello> World

只考虑外部分隔符。里面的任何东西都应该是参数。

【问题讨论】:

  • 所以基本上是String.Format的参考工程师?
  • 你可以考虑使用string.Split结合去掉最后一个字符:World] -&gt; Worldstring.Split 毕竟可能需要多个分隔符。
  • @AustinWBryan 有点像。我需要单独存放它们。
  • @lan 我不知道使用String.Split时哪个是参数和结果。
  • 我的字符串可以看起来像“[he>>o]”吗?

标签: c# .net regex string


【解决方案1】:

您可以尝试使用正则表达式解析出匹配的 &lt;&gt;[] 集。然后你使用regex replacecustom MatchEvaluator

这样的事情可能会奏效:

var regex = new Regex(@"(?<=\<).*(?=\>)|(?<=\[).*(?=\])");
var input = "<Hello> [World]!";
var index = 0;
var replacements = new List<string>();
var formatString = regex.Replace(input, (m) => 
{
    replacements.Add(m.Value);
    return String.Format("{{{0}}}", index++);
});

我还没有真正处理包含&lt;&gt;[] 的输入字符串,但您可以编造和转义模式并处理它。原始正则表达式基于this answer

编辑: Here's a .NET Fiddle for it...

【讨论】:

  • 我做了一个简单的测试并按预期工作,谢谢! =)
  • 只是一个评论。我使用@"(?&lt;=\&lt;).*?(?=\&gt;)|(?&lt;=\[).*?(?=\])" 而不是@"(?&lt;=\&lt;).*(?=\&gt;)|(?&lt;=\[).*(?=\])",因为原来的很贪心。 [Hello] [World] 将变为 [{0}]。添加? 会使其变得懒惰并导致[{0}] [{1}]
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2016-07-25
  • 2021-01-13
相关资源
最近更新 更多