HTML转义-Reg表达式?

HTML转义-Reg表达式?,html,regex,string,escaping,Html,Regex,String,Escaping,我想用HTML自动地、逻辑地转义一个特定的短语,该短语当前是一个带有引号的语句。在语句中,引号或英寸标记也可以用来描述距离 这句话可以是: 保罗说:“它离我们大约一英尺远。”。事实上,它只有大约9英寸 要避开这个短语,它应该是 <pre>Paul said &ldquo;It missed us by about a foot&rdquo;. In fact it was only about 9&prime;.</pre> &ldq

我想用HTML自动地、逻辑地转义一个特定的短语,该短语当前是一个带有引号的语句。在语句中,引号或英寸标记也可以用来描述距离

这句话可以是:

保罗说:“它离我们大约一英尺远。”。事实上,它只有大约9英寸

要避开这个短语,它应该是

<pre>Paul said &ldquo;It missed us by about a foot&rdquo;.  
In fact it was only about 9&prime;.</pre>
&ldquo;
"((?:[^"\d]+|\d"?)*)"
然后

"It just missed" Paul said "by a foot". 如果我找到一个“用一个 “
除非是在一个数字之后,我用

<pre>"It just missed" Paul said "by 9" almost".</pre>
我如何处理句子中的多个引号

“It just missed” Paul said “by 9″ almost”. 保罗说:“它差一英尺就错过了。”。 这真让我难堪

“它刚刚错过了”保罗说“快9点了”。
正确转义时,应读取上述内容。(这次我展示的是真实的角色)

保罗说:“差9分就差了。”。
显然是一个边缘案例,但我想知道是否有可能在不了解内容的情况下在运行时避免这种情况?如果没有帮助,我们将不胜感激。

您可以尝试这样的方法。首先用以下正则表达式替换引号:

而不是英寸标志:

下面是一个JavaScript示例:


你所描述的基本上是一个隐马尔可夫模型

您有一组输入符号(原始文本和模棱两可的标点符号)和一组输出符号(原始文本和更细粒度的标点符号),但没有很好的方法以编程方式真正观察两者之间的联系。您可以编写一些规则来涵盖一些边缘情况,但这基本上不适用于多引号情况。在这种情况下,出于同样的原因,您不能真正使用正则表达式,但是使用一个hmm和一堆训练文本,您可能会做出一些非常好的猜测

遗憾的是,如果你试图为部署准备一些东西,但是输入比输出更模糊,那么你的唯一选择是考虑上下文,这基本上意味着一个非常长的规则集,或者某种机器学习方法。 不过这个问题很有趣——看看你能得到什么样的表现就好了。也许有人已经在上面写过论文了

我想知道是否有可能逃跑 这在运行时不需要 对内容的理解

考虑到您正在为当前编码在其他文本中的标点符号添加语义。。。不,不是真的

正则表达式将是最简单的工具,至少在其中的一部分。我建议在英寸数的情况下使用/\d+“/。但是对于引号分隔符,在您查找了任何其他特殊情况或短语之后,使用匹配对的算法可能会更容易,比如括号和方括号:标记化和计数。然后在实际输入上进行测试并优化


但我真的要问:为什么?

我会分两步来做:

第一遍搜索前面紧跟数字的任何“s”,并进行替换:

s/([0-9])“/\1&Prime;/g

根据您正在处理的文本,您可能希望/需要扩展此正则表达式,以识别拼写为单词的数字;为了简单起见,我只检查了数字

考虑到所有这些因素,第二次传递可以很容易地转换成对的“s”,如您所述:

s/”([^”]*)“/&ldquo;\1&rdquo;/g

注意使用
[^”]*
而不是
*
——我们希望找到两组双引号,它们之间有任意数量的非双引号字符。通过添加该限制,处理带有多个引用节的字符串不会有任何问题。(这也可以通过使用非贪婪的
*?
来实现,但是一个否定字符类可以更清楚地说明您的意图,并且在大多数正则表达式实现中更有效。)


走失的、不匹配的“当然,字符串中的某个地方,或者第一遍漏掉的一个英寸标记,仍然会造成问题,但如果不理解内容,就无法避免这种可能性。

我不确定在不理解句子含义的情况下是否有可能做到这一点。我倾向于对此表示怀疑

我的第一次尝试如下

  • 从左到右穿过绳子
  • 交替使用左双引号和右双引号替换双素数,但如果左边有数字,则替换为双素数
  • 如果字符串末尾的引号不平衡,请返回,直到找到一个带有双引号的数字,并根据前面的双引号将双引号更改为左双引号或右双引号

我很确定你很容易就会失败。但这仍然是一个简单的例子——当你必须处理嵌套引号时,就要开始艰苦的工作。

我知道这是不可能的,但是你考虑过了吗?这是人类擅长解决的问题,而计算机目前却很难解决。选择正确的标点符号需要理解句子的意思,因此正则表达式在边缘情况下肯定会失败。

+1用于先做基本符号。这正确地处理了“几乎9”的情况。
<pre>"It just missed" Paul said "by 9" almost".</pre>
“It just missed” Paul said “by 9″ almost”.
"((?:[^"\d]+|\d"?)*)"
(\d+)"
'"It just missed" Paul said "by 9" almost"'.replace(/"((?:[^"\d]*|\d["']?)+)"/g, "&ldquo;$1&rdquo;").replace(/(\d+)"/g, "$1&Prime;");