Javascript 正则表达式形式{m,n}不使用上限

Javascript 正则表达式形式{m,n}不使用上限,javascript,regex,Javascript,Regex,我的理解是,regexp表单a{m,n}最多匹配a。但是,以下代码段并不像我预期的那样工作(这是javascript): 它不应该返回null吗?它匹配,因为它包含一个正好有两个左大括号的子字符串。如果希望它无法匹配,则必须指定要查找的2个左大括号之外的任何内容都不能是左大括号。它匹配,因为它包含正好有2个左大括号的子字符串。如果希望它不匹配,则必须指定要查找的两个左大括号之外的任何内容都不能是左大括号。表达式的状态是在字符串中的任何位置找到它将找到的{{。如果只想找到{而不是{{{然后需要指定

我的理解是,regexp表单
a{m,n}
最多匹配
a
。但是,以下代码段并不像我预期的那样工作(这是javascript):


它不应该返回null吗?

它匹配,因为它包含一个正好有两个左大括号的子字符串。如果希望它无法匹配,则必须指定要查找的2个左大括号之外的任何内容都不能是左大括号。

它匹配,因为它包含正好有2个左大括号的子字符串。如果希望它不匹配,则必须指定要查找的两个左大括号之外的任何内容都不能是左大括号。

表达式的状态是在字符串中的任何位置找到它将找到的
{{
。如果只想找到
{
而不是
{{{
然后需要指定要查找的:

/[^{]\{{2,2}[^{]/
英文:

[非
{
]的任何字符,后跟[正好2个
{
],后跟[非
{
]的任何字符]


这将匹配
a{{b
,但不匹配
a{b
,也不匹配
a{{{b

表达式在字符串中的任何位置的状态,它将找到该字符串。如果只想找到
{/code>而不是
{{/code>,则需要指定要查找:

/[^{]\{{2,2}[^{]/
英文:

[非
{
]的任何字符,后跟[正好2个
{
],后跟[非
{
]的任何字符]


这将匹配
a{{b
,但不匹配
a{b
,也不匹配
a{{{b
,正则表达式正是在寻找两个左大括号(
{
),它在索引2(第一个“df”之后)的字符串“
df{{df
”中找到了这两个左大括号.看起来很对。

正则表达式正在查找正好两个左大括号(
{{
),它在索引2的字符串“
df{{{{df
”(紧跟在第一个“df”之后)中找到。看起来很对。

它与文本匹配,因为有两个文本。这满足正则表达式指定的要求。如果要防止额外项匹配,请使用负前瞻:
(?!\{)

然后,使用第一个捕获的组

顺便说一下,编辑
{2,2}
中的
,2
在这种情况下是可选的,因为它是相同的数字

编辑:添加了使用示例以删除第一个匹配的字符。(Javascript不支持负查找。)

var myRegexp = /(?:^|[^{])(\{{2,2}(?!\{))/g;
var match = myRegexp.exec(myString);
alert(match[1]);

它与文本匹配,因为有两个文本满足您的正则表达式指定的要求。如果您想阻止附加项匹配,请使用负前瞻:
(?!\{)

然后,使用第一个捕获的组

顺便说一下,编辑
{2,2}
中的
,2
在这种情况下是可选的,因为它是相同的数字

编辑:添加了使用示例以删除第一个匹配的字符。(Javascript不支持负查找。)

var myRegexp = /(?:^|[^{])(\{{2,2}(?!\{))/g;
var match = myRegexp.exec(myString);
alert(match[1]);

我将
[“{{”]
作为正确的输出。您希望得到什么?我将
[“{{”]
作为正确的输出。您希望得到什么?谢谢,但我可能需要匹配字符串开头或结尾的两个
{
,在这种情况下,此regexp不起作用……也不起作用,`/[^{]?\{2}[^{]?/@Thaddetyl:您可以始终使用交替:
/(^ ^ ^[^{])\{2,2}([^{]$)/
您可以使用线的开始和结束锚定:
/(^ ^[^{])\{2,2}($.[^{])//code>
[字符串的开始或不是一个{][2}[字符串的结束或不是一个{]
谢谢,但我可能需要匹配两个
{
位于字符串的开头或结尾,在这种情况下,这个regexp不起作用,`/[^{]?\{{2}[^{]?/@Thaddetyl:您可以始终使用替换:
/(^{124;[^{])\{2,2}([^{]\$)/
您可以使用行首和行尾锚点:
/(^{124;代码>/(^.[^/}]){{{{2,2}($/}/code>)或不完全是字符串的开头{][string结尾是否为{]
您可以使用
{2}
而不是
{2,2}
。另外,就个人而言,我更喜欢负面的lookback
(?而不是开头的非捕获组(但那是我;)+1@mhyfritz,我也更喜欢负面回顾,但OP的正则表达式风格不支持它们:-(@agent-j:Sharp!我完全忘记了这一点。@mhyfritz-Negative lookback在javascript中似乎不起作用。@agent-j所以事实上,{m,n}形式的上限永远不会被读取?你可以使用
{2}
而不是
{2,2}
。另外,就我个人而言,我更喜欢负lookback
(?而不是开始时的非捕获组(但那是我;)无论如何+1@mhyfritz,我也更喜欢负lookback,但OP的正则表达式风格不支持它们。:-(@agent-j:Sharp!我完全忘记了这一点。@mhyfritz负lookback在javascript中似乎不起作用。@agent-j所以实际上,{m,n}的上限表格真的是不可读的吗?