Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 转换&;至&;amp;同时保留现有实体引用_Regex_String - Fatal编程技术网

Regex 转换&;至&;amp;同时保留现有实体引用

Regex 转换&;至&;amp;同时保留现有实体引用,regex,string,Regex,String,我有一些肮脏的数据,需要用一种巧妙的方式来清理。基本上,我需要将一些包含lone&的字符串实体编码为&。不幸的是,有些字符串中还有其他字符实体,这意味着我无法进行简单的全局替换 我已经抽查了400多万个字符串中的一些,到目前为止,我所看到的情况表明,大多数lone&s都被空格包围,但我不是100%确定 这有点超出了我的正则表达式fu。您可以使用(\W)和(\W)来查找。。并替换为$1&$2跳过已经是有效实体的实体 也许先看看你的收藏中有哪些命名实体。我没有尝试创建一个完整、全面的正则

我有一些肮脏的数据,需要用一种巧妙的方式来清理。基本上,我需要将一些包含lone
&
的字符串实体编码为
&。不幸的是,有些字符串中还有其他字符实体,这意味着我无法进行简单的全局替换

我已经抽查了400多万个字符串中的一些,到目前为止,我所看到的情况表明,大多数lone&s都被空格包围,但我不是100%确定


这有点超出了我的正则表达式fu。

您可以使用
(\W)和(\W)
来查找。。并替换为
$1&$2

跳过已经是有效实体的实体

也许先看看你的收藏中有哪些命名实体。我没有尝试创建一个完整、全面的正则表达式。您希望确保正则表达式具有您实际使用的所有正则表达式。差不多

grep -Eio '&[a-z]+;' file more files | sort | uniq -c | sort -rn
perl -i.bak -pe 's/&(?!(?:#(?:\d+|x\x+)|amp|lt|gt|quot|apos|nbsp);)/&/g' file more files
将向您显示可能命名实体的频率列表。然后你可以做类似的事情

grep -Eio '&[a-z]+;' file more files | sort | uniq -c | sort -rn
perl -i.bak -pe 's/&(?!(?:#(?:\d+|x\x+)|amp|lt|gt|quot|apos|nbsp);)/&/g' file more files

这有点特别——您应该使用集合中的所有实体扩展命名实体列表。也许你有很多
&rarr
&hellip
复制
Å或其他任何内容--您没有向我们展示示例,因此我们无法知道。在这个快速而肮脏的概念验证中,肯定缺少了一些内容。

使用反向前瞻来定位单个
&
s

根据实体名称规则,有效的实体名称以字母开头(在这种情况下,后面只能是字母、数字和单个的
)注释,或者后跟
#
、数字和终止的
。您的示例
&1111不是有效的XML实体,
&
应替换为
&

使用此GREP序列定位杂散的安培数:

&(?![_a-zA-Z]\w*;)(?!#\d+;)
并替换为

&
请注意,允许再输入几个字符。请参阅中的
namestart
NameChar
,以了解延迟列表

s/&(?![a-zA-Z#])/&/g
不会超过对手

符号AND后跟字母可以是命名字符引用,而符号AND后跟
#
字符可以是数字字符引用

这将不匹配无效的实体名称,如
¬anity


您可以将其收紧,以匹配不属于数字字符引用的
&
,但我想看看数字引用是否出现在您的语料库中。

您使用的是什么语言?正如我所说,并非所有的
&
都会被空格包围。在脸上,我发现了一些没有也不能改变的东西,因为它们是一部作品的标题。它们周围都是什么。。如果是这样,为什么它们被称为lone?我用lone的意思是&不是角色实体的一部分。示例:
title='&mpersand:Adventures in Typ…“
in标题不是一个实体。下面是另一个例子:
title='*@##&@!!:当一切再次陷入困境时,“
不是实体标记。如果它是word的一部分,是否要替换标题中的(&I)?如果它不是字符实体的一部分,我要替换(&I)。如果字符串包含类似&1111;或者,不要将其替换为&;。否则,请务必更换。