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+$