Javascript 正则表达式匹配&;amp;实体或;amp#0-9; 和捕获&;amp;

Javascript 正则表达式匹配&;amp;实体或;amp#0-9; 和捕获&;amp;,javascript,regex,Javascript,Regex,我正在尝试替换以下字符串原型:“我在雨中唱歌跳舞。”以下正则表达式正确匹配实例,但也捕获了实例后面的字符“(&;)[#?a-zA-Z0-9;]”从上述原型捕获以下字符串:“&;l” 如何将其限制为仅捕获& 编辑:我应该添加我不想单独匹配“&;”的内容。实际上您正在匹配字符串&;l但捕获的只是&。这是因为捕获组后面的字符类将匹配其他字符 但你原来的正则表达式一开始就有点缺陷。(非最佳)替换可能是: &(#[0-9]+|#x[0-9a-zA-Z]+

我正在尝试替换以下字符串原型:
“我在雨中唱歌跳舞。”
以下正则表达式正确匹配实例,但也捕获了
实例后面的字符
“(&;)[#?a-zA-Z0-9;]”
从上述原型捕获以下字符串:
“&;l”

如何将其限制为仅捕获
&

编辑:我应该添加我不想单独匹配
“&;”
的内容。

实际上您正在匹配字符串
&;l
但捕获的只是
&。这是因为捕获组后面的字符类将匹配其他字符

但你原来的正则表达式一开始就有点缺陷。(非最佳)替换可能是:

&(#[0-9]+|#x[0-9a-zA-Z]+|[a-zA-Z]+);
它将匹配完整的实体或字符声明并捕获
&

查找(这适用于命名、十进制和十六进制实体):

取代

&$1;
请注意:这很有可能出错。我建议使用HTML解析器来解码文本。如果它是双重编码的,你可以解码两次。HTML和正则表达式即使在小规模上也不能很好地结合在一起


因为您使用的是JavaScript,所以我希望您使用的是浏览器。如果您是,那么您手头就有一个很好的DOM解析器。创建一个新元素,将字符串指定给它的内部HTML属性并读取文本值。完成。

如果您只想匹配
&
,为什么还要包括字符类
[#?a-zA-Z0-9;]

在英语中,表达式应该是“Match
&;
,后跟一个字符,即#、?、小写字母、大写字母或;”

只需使用
(&;)

您的意思可能是:

"&([#a-zA-Z0-9]+;)"

我推测您希望匹配
&,但仅当后跟字母数字字符或某些标点符号时。这需要向前看。此正则表达式应该与您想要的匹配,而不捕获或使用任何其他字符


(&;)(?=[#?a-zA-Z0-9;])

这将匹配
“一个符号和一个分号”
现在更好了。
周围的括号&是不必要的,但比赛其余部分周围的非捕获组会适得其反。您将如何替换匹配项?:)哦,好吧,我仍然在OP的原始世界,他想在那里捕捉
&。当然,对于所有实际用途来说,它都是无用的,但无论如何:-)。我使用了一个非捕获组,以避免将任何人与两个捕获混淆,其中一个捕获本来是预期的:-)这部分工作,但不匹配字符串,如:
“&;#0972;”
我还必须将替换字符串更改为:
”&$1;
我最终得到了以下搜索模式:
“&;([a-Za-z]+#?[0-9]+)”
和以下替换字符串:
“&$1;”
我应该提到,此替换方案实际上会从数值实体中删除前导0,但是这似乎不会影响实体的呈现。另外,由于我不知道的原因,使用
“\d+”
而不是
“[0-9]”
不起作用。好的,反向引用依赖于实现。有些使用反斜杠,有些使用美元符号。我已经编辑了正则表达式以包含对十进制和十六进制数字实体的适当支持。哇,你说得对。该死.-)我将删除第二个正则表达式。这在Firefox中没有任何作用。。。虽然我没有检查其他浏览器。JavaScript正则表达式引擎支持lookaheads吗?Mozilla开发者参考说是的。Rob Kennedy:这里你错了
[#?a-zA-Z0-9;]
-这是一个字符类,它匹配这些字符中的任何一个(没有量词!)。此外,字符类没有顺序,因此它相当于,比如说
[?0-9;#a-zA-Z]
。Tomalak,您已经准确地描述了我的正则表达式。怎么会错呢?如果这些字符中的任何一个后跟
&,我们希望正则表达式匹配。我们不关心接下来会发生什么,只要第一个角色在该角色类中。至少,这是原始正则表达式规定的。我选择的顺序只是重复问题中显示的顺序。这既不重要也不相关,Tomalak正确地推断出我打算匹配HTML字符实体,这需要量化,或者至少匹配符合条件的单个字符后的分号。
"&([#a-zA-Z0-9]+;)"