许多语言使用某种引号绑定字符串,如下所示:
“Rob Malda很聪明。”
ANTLR 4可以将这样的字符串与如下lexer规则匹配:
QuotedString: '"' . *? '"';
要在字符串中使用某些字符,必须对其进行转义,可能如下所示:
“罗伯”塔科指挥官“马尔达很聪明。”
ANTLR 4也可以匹配此字符串;
转义字符串:'"'('\\"|.)*?'"';
(摘自最终ANTLR 4参考文献第96页)
我的问题是:假设用于转义的字符与字符串分隔符相同。例如:
“Rob”“Commander Taco”“Malda很聪明。”
(这在Powershell中完全合法。)
什么lexer规则会匹配这个?我认为这会起作用:
转义字符串:“”(“”)*?“”
但事实并非如此。lexer将转义字符标记为字符串分隔符的结尾。
(不要投票支持这个答案;投票支持@Bart Kiers的答案。)
我提供这个是为了完整性,因为它是Powershell语法的一小部分。将权威ANTLR 4参考中p76的转义逻辑与Bart的答案相结合,以下是在Powershell中词典转义字符串所需的规则:
EscapedString
: '"' (Escape | '""' | ~["])* '"'
| '\'' (Escape | '\'\'' | ~['])* '\''
| '\u201C' (Escape | .)*? ('\u201D' | '\u2033') // smart quotes
;
fragment Escape
: '\u0060\'' // backtick single-quote
| '\u0060"' // backtick double-quote
;
这些规则处理以下四种在Powershell中转义字符串的方法:
'Rob ''Commander Taco'' Malda is smart.'
"Rob ""Commander Taco"" Malda is smart."
'Rob `'Commander Taco`' Malda is smart.'
"Rob `"Commander Taco`" Malda is smart."
使用运算符对某些字符求反:
EscapedString : '"' ( '""' | ~["] )* '"';
或者,如果字符串中没有换行符,请执行以下操作:
EscapedString : '"' ( '""' | ~["\r\n] )* '"';
您不想使用非贪婪运算符,否则"
永远不会被消费,"a""b"
将被标记为"a"
和"b"
而不是单个标记。
我的原始 sql:
问题内容: 我想将包含转义字符的字符串转换为普通格式,就像Python的词法分析器所做的一样: 当然,无聊的方法是将所有已知的转义字符一一替换:http : //docs.python.org/reference/lexical_analysis.html#string- literals 您将如何在上述代码中实现? 问题答案: 几个类似的编解码器是可用的,如ROT13和十六进制。 上面是Pyth
问题内容: 想知道是否有一种简单的方法可以在Objective C中执行简单的HTML转义/转义。我想要的是这样的伪代码: 哪个返回 希望也转义所有其他HTML实体,甚至ASCII码(例如Ӓ等)。 Cocoa Touch / UIKit中有什么方法可以做到这一点? 问题答案: 包含以下解决方案。可可CF具有CFXMLCreateStringByUnescapingEntities函数,但在iPho
问题内容: 我正在编写一个Java程序来读取XML文件,实际上是一个iTunes库,它是XML plist格式。我设法解决了这种格式引发的大多数障碍,除非遇到包含的文本。XLM文件将“与”号表示为,并且我只能设法在文本的任何特定部分之后读取文本。 有没有办法禁用转义码检测?我正在使用SAXParser。 问题答案: 您尝试执行的操作有些混乱。 如果您尝试解析的文件格式包含“&” 字符,则它 不是
问题内容: 我从服务器获取JSON数据,其中一个字段包含转义的html(实际上是电子邮件正文): (更多…) 我为尝试使用AngularJs渲染而疯狂。 以下内容不起作用: 我认为这是正常的,因为html实际上已经转义了。我应该先取消转义吗?Angular是否可以通过某些可用服务转义html? 如果我这样使用$ sce: 显示源html,检查元素可以看到引用的内容。换句话说,在页面中将显示源htm
问题内容: 我正在尝试下面的代码,但出现错误 错误 我想要结果 问题答案: 请改用,它不使用正则表达式,因为您根本不需要它们: 这将按预期打印。