public interface IBlock
{
string Quote();
void Append(char c);
bool ShouldAppendQuotedBlock(char c);
}
public abstract class NestedBlock : IBlock
{
private readonly NestedBlock parent;
private readonly List<IBlock> blocks;
private IBlock currentBlock;
public NestedBlock(NestedBlock parent)
{
this.parent = parent;
blocks = new List<IBlock>();
}
public virtual string Quote()
{
StringBuilder stringBuilder = new StringBuilder();
foreach (IBlock block in blocks)
{
stringBuilder.Append(block.Quote());
}
return stringBuilder.ToString();
}
public abstract void Append(char c);
public abstract bool ShouldAppendQuotedBlock(char c);
protected NestedBlock Parent
{
get { return parent; }
}
protected IBlock CurrentBlock
{
get { return currentBlock; }
}
public void AppendBlock(IBlock block)
{
blocks.Add(block);
currentBlock = block;
}
}
public class QuotedBlock : NestedBlock
{
private readonly IQuoteStrategy quoteStrategy;
private readonly char expectedQuote;
public QuotedBlock(IQuoteStrategy quoteStrategy, char expectedQuote, NestedBlock parent) : base(parent)
{
this.quoteStrategy = quoteStrategy;
this.expectedQuote = expectedQuote;
AppendBlock(new RootBlock(quoteStrategy));
}
public override string Quote()
{
return expectedQuote + quoteStrategy.Quote(base.Quote()) + expectedQuote;
}
public override void Append(char c)
{
if (c == expectedQuote)
{
Parent.AppendBlock(new UnquotedBlock());
}
else
{
CurrentBlock.Append(c);
}
}
public override bool ShouldAppendQuotedBlock(char c)
{
return false;
}
}
public class UnquotedBlock : IBlock
{
private readonly StringBuilder stringBuilder = new StringBuilder();
public string Quote()
{
return stringBuilder.ToString();
}
public void Append(char c)
{
stringBuilder.Append(c);
}
public bool ShouldAppendQuotedBlock(char c)
{
return IsQuotationMark(c);
}
private static bool IsQuotationMark(char c)
{
if (c == '"')
{
return true;
}
return c == '\'';
}
}
public class RootBlock : NestedBlock
{
private readonly IQuoteStrategy quoteStrategy;
public RootBlock(IQuoteStrategy quoteStrategy) : base(null)
{
this.quoteStrategy = quoteStrategy;
AppendBlock(new UnquotedBlock());
}
public override void Append(char c)
{
if (CurrentBlock.ShouldAppendQuotedBlock(c))
{
AppendBlock(new QuotedBlock(quoteStrategy, c, this));
}
else
{
CurrentBlock.Append(c);
}
}
public override bool ShouldAppendQuotedBlock(char c)
{
throw new ViScriptSystemException();
}
}
分享到:
相关推荐
说明当在SQL语句中含有字符串时,如何使用单双引号的问题,以及介绍不同方式查询时的单双引号如何使用。
解决TongWeb7.0.4.2-7.0.4.3引号嵌套报错问题
SQL里单双引号使用区别(详细介绍加例子)
shell 单双引号 区别 易懂 ,非常易懂 全面!
单引号和双引号之间可以相互嵌套。 1、单引号内只能嵌套双引号。...以上所述是小编给大家介绍的关于JavaScript的单双引号嵌套问题 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
NULL 博文链接:https://yjgyjg4.iteye.com/blog/618793
主要介绍了JavaScript 限制文本框不可输入英文单双引号的方法的相关资料,需要的朋友可以参考下
随机单双随机单双随机单双随机单双
①转义的字符不同 单引号和双引号中都可以使用转义字符(\),但只能转义在单引号中引起来的单引号和转义转义符本身。如果用双引号(“”)括...双引号字符串最重要的一点是其中的变量名会被变量值替代,即可以解析双引号
今天小编就为大家分享一篇解决python3插入mysql时内容带有引号的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
使用PHP脚本语言进行开发,什么时候用单引号、什么时候使用双引号对运行效率至关重要,想学习如何在PHP中区分单双引号的使用,请下载此文档,希望对需要的朋友带来帮助,谢谢。
对于计算机中常见的浮点数存储格式进行分析,编程提取float和double中的阶码好尾码。
您可能感兴趣的文章:简单概括PHP的字符串中单引号与双引号的区别PHP中单引号与双引号的区别分析PHP 单引号与双引号的区别php 输出双引号"与单引号”的方法PHP的单引号和双引号 字符串效率浅谈PHP中单引号和双引号...
随机单双.zip
单双(中边)预测单双(中边)预测单双(中单双(中边)预测边)预测单双(中边)预测
php单引号和双引号的区别
这是js中的代码,如果这里这样写的话,会提示js错误,是因为removeOpenCss方法里的参数没有单引或者双引,如果这里,这样写的话: ... 直接会报错,因为这里单引和双引冲突,所以我只通过这样解决
易语言模块数字单双.rar
假如有下述表格: mytabe 字段1 username 字符串型(姓名) 字段2 age 数字型(年龄) 字段3 birthday 日期型(生日) 字段4 marry 布尔型(是否结婚,结婚为True,未结婚为False) 字段5 leixing ...