我有什么我猜是一个逻辑问题。我正在用 C# 编码,但欢迎使用通用的伪代码解决方案。

我有这个文本文件,其中包含例如以下文本:

blah "hello john"
blah 'the code is "flower" '
blah "good night"

我想遍历双引号并对它们做一些事情,但我想忽略单引号中包含的双引号。我得到了开头双引号和结尾双引号的位置(string data 包含文本文件的内容):

C#
// Start searching from beginning
int quotestart = 0, quoteend = 0;

while (data.IndexOf('"', quotestart) != -1)
{
  // Get opening double quote
  quotestart = data.IndexOf('"', quotestart);
  // Get ending double quote
  quoteend = data.IndexOf('"', quotestart + 1);

  string sub = data.Substring(quotestart + 1, quoteend - quotestart - 1);
  Console.WriteLine(sub);

  // Set the start position for the next round
  quotestart = quoteend + 1;
}

使用我的代码,输出将是:
hello john
flower
good night

因为“花”在单引号内,我希望我的输出是:
hello john
good night

编辑

我目前正在研究一种方法,首先在单引号之间填充所有数据,例如“A”。这样,当我遍历双引号时,单引号之间的任何数据都将被忽略。不确定这是否是正确的方法。

最佳答案



FSM 是最简单的计算机形式之一。这个想法是您拥有有限数量的“状态”信息和稳定的输入流。每个输入导致状态以可预测的方式改变, 仅基于当前状态和当前输入 ,并导致可预测的输出发生。

因此,假设您的输入是单个字符,而您的输出是单个字符或“空”字符。这是一个可以满足您要求的 FSM:

  • 状态是 OUTSIDEINSIDEDOUBLEINSIDESINGLE
  • 输入是 "'x 。 (WOLOG 让 x 代表任何其他字符。)

  • 我们有三个状态和三个输入,所以有九种可能的组合。
  • 如果我们是 OUTSIDE 并获得 x ,则保持 OUTSIDE 并发出 null
  • 如果我们是 OUTSIDE 并获得 " ,则转到 INSIDEDOUBLE 并发出 null
  • 如果我们是 OUTSIDE 并获得 ' ,则转到 INSIDESINGLE 并发出 null
  • 如果我们是 INSIDEDOUBLE 并获得 x ,则保持 INSIDEDOUBLE 并发出 x
  • 如果我们是 INSIDEDOUBLE 并获得 " ,去 OUTSIDE 并发出 null
  • 如果我们是 INSIDEDOUBLE 并获得 ' ,则保持 INSIDEDOUBLE 并发出 '
  • 如果我们是 INSIDESINGLE 并获得 x ,则保持 INSIDESINGLE 并发出 null
  • 如果我们是 INSIDESINGLE 并获得 " ,则保持 INSIDESINGLE 并发出 null
  • 如果我们是 INSIDESINGLE 并获得 ' ,去 OUTSIDE 并发出 null

  • 唯一剩下的就是说开始状态是 OUTSIDE

    所以让我们假设输入是 1 " 2 " 3 ' 4 " 5 " ' 6 。状态和输出是:
  • OUTSIDE 获取 1 ,发出 null ,保持 OUTSIDE
  • OUTSIDE 得到 " ,发出 null ,去 INSIDEDOUBLE
  • INSIDEDOUBLE 获取 2 ,发出 2 ,保持 INSIDEDOUBLE
  • INSIDEDOUBLE 得到 " ,发出 null ,去 OUTSIDE
  • OUTSIDE 获取 3 ,发出 null ,保持 OUTSIDE
  • OUTSIDE 得到 ' ,发出 null ,去 INSIDESINGLE

  • ... 其余的自己填写。

    这是否足以让您编写代码的草图?

    关于c# - 循环双引号但忽略单引号中的双引号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19528978/

    10-13 07:24