【问题标题】:How do I prevent a string from appearing in a result string when a set of child strings are concatenated to form the result string?当一组子字符串连接形成结果字符串时,如何防止字符串出现在结果字符串中?
【发布时间】:2013-01-28 12:35:52
【问题描述】:

我有 5 个字符串,我们就叫它们

  • EarthString
  • FireString
  • WindString
  • WaterString
  • HeartString

它们都可以有不同的长度,它们中的任何一个都可以是空的,或者可以很长(但不能为空)。

这5个字符串是很要好的朋友,每个周末都用这个c#语句将它们串联起来形成一个结果字符串

ResultString = EarthString + FireString + WindString + WaterString + HeartString

根据这些字符串的值,有时(仅有时)ResultString 将包含“Captain Planet”作为子字符串。

我的问题是,如何在 5 个字符串连接之前对其进行操作,以便在组合它们时,“Captain Planet”永远不会在结果字符串中作为子字符串出现?

我现在能想到的唯一方法是按顺序检查每个字符串中的每个字符,但这似乎很乏味。由于 5 个好朋友字符串中的每一个都可以是任意长度,因此单独检查这些字符还需要进行某种连接,然后才能确定是否需要删除任何字符。

编辑:结果字符串是连接在一起的 5 个字符串的过滤版本,所有其他内容保持不变,除了“Captain Planet”字符串被删除。是的,我正在寻找一种允许在连接之前对 5 个字符串进行操作的解决方案。 (这实际上是我遇到的更大编程问题的简化)。谢谢大家。

【问题讨论】:

  • 我的意思是,你会怎么做,反正很好,只是想知道其他程序员如何解决这个问题
  • 这似乎是一个非常奇怪的问题。这些字符串可以按任何顺序连接吗?您是否必须独立预处理所有这些字符串?你知道编译时的“Captain Planet”子串吗?是否有一个或多个“Captain Planet”字符串需要注意?连接后是否必须保存字符串内容?一系列string 是对您的问题建模最合适的方式吗?
  • 有什么真正的原因你不能在连接后删除“Captain Planet”吗?
  • 为什么不用简单的字符串替换ResultString.Replace("Captain Planet", "");
  • 目前,您遇到了 XY 问题。你试图通过做 Y 来解决 X,所以你问如何完成 Y。相反,更详细地描述 X——你的输入是什么,你的预期输出是什么。我假设您的数据结构中有一些分隔符需要删除。在这种情况下,让它变得更简单会妨碍您获得适当的帮助。

标签: c# regex string parsing filter


【解决方案1】:

如果你想预先连接,你可以

根据它们所包含的“CaptainPlanet”部分为每个字符串的开头和结尾分配一个数值。例如:如果 Air = "net the big Captain",那么它会得到 3 的起始值和 7 的结束值。要确定是否可以安全地连接 2 个值,您只需检查左侧字符串的结尾 + 右侧字符串的开头是否不等于“CaptainPlanet”的总长度。如果您有非常大的字符串,这将允许您仅检查字符串的前 x 和最后 x 字符来计算开始/结束值。

此解决方案不考虑 ei air = "Cap" 、 earth ="tain" 和 fire="Planet" 等短字符串。在这种情况下,对于那些比“CaptainPlanet”长度短的令牌,您需要有一个特殊情况。

【讨论】:

  • 试图让它不再是我的思想流,而是以某种更清晰的方式给出答案。谢谢 J. Steen
  • 是的,这就是我面临的困难,因为“Captain Planet”字符串可能以多个字符串的串联形式存在,每个字符串的长度可能不同,甚至可能为空,很难告诉它从哪里开始和在哪里结束。非常感谢您的回答
  • 对于最后一种情况,您可以检查字符串是否是要避免的字符串的子字符串。在您的示例中,earth 字符串是一个子字符串,您可以存储一些信息来补充您的测试。
【解决方案2】:

你不能这样做有什么特殊原因吗?

ResultString.Replace("CaptainPlanet", "x"); 

【讨论】:

    【解决方案3】:

    如果丢弃多少字符都无所谓,您可以删除 f.e.所有字符串中的所有'C'

    【讨论】:

      【解决方案4】:

      原始答案清除了所有字符串,但正如 J.Steen 所指出的,已经有一个预期输出的公式。所以我们开始了。

      1. 对每个子字符串运行elementString.Replace("Captain Planet", "")

      2. 现在您必须识别每个子字符串上“Captain Planet”的所有前缀/后缀,并保留该信息,以便在合并之前对其进行处理。也就是说,例如如果子字符串以“Capt”结尾,那么您应该有一个信息,“子字符串末尾包含 'Captain Planet' 的 4 个首字母的前缀”。您还必须考虑完整子字符串的情况(例如,其中一个字符串是“ptain Pla”)。如果有任何一个问题,问题也会变得更加复杂。前缀可以是递归的或重复的(例如“CaptainCap”包含“CaptainCaptain”的两种有效前缀,并且“apt”可以在结果字符串的两个位置找到);

      3. 您在连接之前处理该信息,以便结果字符串与ResultString.Replace("Captain Planet", "") 具有相同的内容。恭喜,您的程序比必要的复杂得多!

      但简而言之,您无法获得您想要的结果(除了组合结果输出之外的所有子字符串都完好无损)并在连接步骤之前完全进行处理。

      【讨论】:

      • 我认为这仍然是一个很好的答案,问题是这个(Steen 是对的),我正在寻找一组字符串中的特定分隔符。假设“Captain Planet”是一个特殊字符串,用于在一组字符串中开始一些特殊的代码字符串,我怎么知道它什么时候开始?以及如何从字符串中删除这个特殊的分隔符及其代码?代码本身也分散在多个字符串中。碎片的原因是因为字符串是由某个应用程序(我无法控制)通过网络发送的,而我在接收端。
      • 我无法处理连接的字符串,因为我无法控制执行连接的应用程序。假设我是这里做过滤的中间人。我不能删除任何字符串,但我可以删除每个字符串中的字符。我可以添加到任何字符串,我可以将其设为空,或将其设为很长。这些是我可以做的转变。谢谢
      猜你喜欢
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多