Regex 如果字符不是前导字符和尾随字符,则使用正则表达式匹配数字

Regex 如果字符不是前导字符和尾随字符,则使用正则表达式匹配数字,regex,Regex,我需要匹配数字,只要它不在{和}之间 示例: {1} - should not match 1 - should match 2 - should match {91} - should not match 3 - match 0 - match {1212} - should not match 我写了这个(?!{)[\d](?!}) 它正确地匹配{和}之外的数字,但是当{}中有超过1个数字时,例如{123},则它匹配12,不包括最后一个数字。以下正则表达式将执行此操作: ^(?!={

我需要匹配数字,只要它不在
{
}
之间

示例:

{1}  - should not match  
1 - should match
2 - should match
{91} - should not match
3 - match
0 - match
{1212} - should not match
我写了这个
(?!{)[\d](?!})


它正确地匹配
{
}
之外的数字,但是当
{}
中有超过1个数字时,例如
{123}
,则它匹配
12
,不包括最后一个数字。

以下正则表达式将执行此操作:

^(?!={)(\d+(!=})$
^(?!{)(\d+(!})$

您应该使用以下方法:

^(?!\{)(\d+)(?!\})$
这是您的正则表达式,但我添加了
\
以转义
{
,并添加了一个组
(\d+
)以获取所需的数据;)

也许可以试试这个“

你最好选择:

\d+(?![^{]*})
解释:

(我在本例中使用了javascript)

\d+           # Any digits
(?![^{]*})    # Negative lookahead - demonstrating to not within curly braces 
这个简单的正则表达式应该准确地显示您不想要的内容,因此只需检查它是否与这个正则表达式不匹配:

var strings = ['{1}', '1', '2', '{{91}', '3', '0', '{1212}'];
strings.map(function (str) {
    return !str.match(/(\{\d+\})/); 
}); // returns [false, true, true, false, true, true, false]

如果您还想排除只在一侧有花括号的数字,如
{123
123}
,则可以使用以下正则表达式(使用负向后看和负向前看):

(?

如果要包含只有一侧有花括号的数字,可以使用条件:

(?<![{\d])\d+(?![}\d])|(?<={)\d+(?![}\d])|(?<![{\d])\d+(?=})
(?


说到regexp,简单就是美丽

^\d+$ 

没有lookaheads或其他复杂的构造。它可能是最简单的regexp,可以为您提供的示例输入生成正确的结果。

数字部分需要“贪婪”运算符。查看alerady发布的答案,显然您应该更详细地解释问题的上下文。这些是数字吗(就像在你的例子中)一行接一行地单独出现在新行上?它们只是被
{}
包围还是什么都没有?或者还会有其他字符吗?还有:{}可以嵌套吗?是
13}
valid?只需^\d+$就可以了吗?它将完全满足您指定的输入要求。@Lordofpigs好主意!这里的大多数海报都没有看到这种简单的解决方法。这证明了问题不仅仅在于他的示例中的OP reveales=)您能否详细说明一下负面前瞻如何与
[^{]*
?@Neftas先行断言不必具有固定的宽度,因此我们可以使用量词。也就是说,
(?![^{]*})
将单独查找不在括号内的任何位置。因此,基本上,您要查找的是长度为1或更长的数字,如果它找到了,正则表达式将继续查找另一个开头的卷曲括号
{
,并开始回溯,看看它是否能找到靠近数字的右大括号。
。如果不能找到,则匹配,如果匹配,则不匹配。非常巧妙,谢谢!:)@Neftas正在寻找左大括号
{
不是从一个特定的位置开始的。Lookahead(作为一个Lookahead)作为一个Lookahead,无论它是否匹配位置,都会返回true。所以我写的不仅仅是上面的正则表达式!!你也可以用
(?![^{]*})\d+
获得同样的结果。不客气!它会失败
91}
case,尽管OP没有这样的示例。我认为regexp应该是
^(\d+(!})$
=
是多余的)。这只适用于
^$
锚。错误!这将匹配
{91}
中的
9
。正确,但模式得到一个
匹配()
已拒绝,因此这不是问题。但将其更改为
^(?!\{)(\d+(!\})$
您现在无法纠正此问题。但这取决于
^$
锚定。让我们看看提问者是否会添加进一步的上下文。我喜欢此解决方案,因为它不需要令人难以置信的regexp语句来完成看似琐碎的任务。但如果此解决方案是通过,则这很大程度上取决于问题的上下文ble(见我对这个问题的评论)。顺便说一句,你已经用JS写了它,但是在每种语言中都可以这样做。基本概念是将逻辑从正则表达式转换到编程语言——这通常是个好主意:)我想知道为什么每个人都在负面环视中使用多余的
=
:)语法是
(?=
表示正向前瞻,而
表示负向前瞻(其中
\u
是内部正则表达式的占位符)。与lookbehinds类似。除了给定的示例之外,思考得很好=)
(?<![{\d])\d+(?![}\d])
(?<![{\d])\d+(?![}\d])|(?<={)\d+(?![}\d])|(?<![{\d])\d+(?=})
^\d+$