标签: negative-lookahead

正则表达式匹配{1,2,3,4}的所有排列而不重复

我在ruby中实现了以下问题.

这是我想要的模式:

1234,1324,1432,1423,2341等

即四位数字中的数字应该在[1-4]之间,也应该是非重复的.

为了让你以一种简单的方式理解我采取两位数模式,解决方案应该是:12,21

即数字应为1或2,并且应该是非重复的.

为了确保它们不重复,我想使用$ 1作为我的第二个数字的条件,但它不起作用.

请帮助我,并提前感谢.

regex permutation lookahead negative-lookahead

10
推荐指数
3
解决办法
6859
查看次数

Python中的可变宽度Lookbehind问题

我有以下场景:

1) car on the right shoulder
2) car on the left shoulder
3) car on the shoulder
Run Code Online (Sandbox Code Playgroud)

当左边没有时,我想匹配"肩膀".所以只有3)回归"肩膀"

re.compile(r'(?<!right|right\s*)shoulder')
sre_constants.error: look-behind requires fixed-width pattern
Run Code Online (Sandbox Code Playgroud)

好像我不能用\ s*和"|"

我该怎么解决这个问题.

提前致谢!

python regex negative-lookahead lookbehind

10
推荐指数
1
解决办法
3761
查看次数

需要正则表达式来匹配不能全为零的可变长度数字串

我需要验证表单上的输入.我期望输入是1到19位数之间的数字.输入也可以以零开头.但是,我想验证它们并非都是零.我有一个正则表达式,将确保输入是数字和1到19之间的数字.

^\d[1,19]$
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何包含一个检查,即整个字符串不是全零.我试过这个

^(![0]{1,19})(\d[1,19])$
Run Code Online (Sandbox Code Playgroud)

但它在0000000000000000001上失败,因为它允许可变数量的零.

如何检查整个字符串是不是零?

谢谢.

我试图在ASP.NET RegularExpressionValidator中这样做,所以我希望有一个表达式.我有其他选择,所以如果不能做到这一点我就不会运气.

regex validation pcre lookahead negative-lookahead

9
推荐指数
1
解决办法
2万
查看次数

正则表达式:两场比赛之间的负向前瞻

我正在尝试构建一个像这样的正则表达式:

[match-word] ... [exclude-specific-word] ... [match-word]
Run Code Online (Sandbox Code Playgroud)

这似乎与负面预测有关,但是当我遇到这样的情况时,我遇到了问题:

[match-word] ... [exclude-specific-word] ... [match-word] ... [excluded word appears again]
Run Code Online (Sandbox Code Playgroud)

我希望上面的句子匹配,但是第一个和第二个匹配单词之间的负面预测"溢出",所以第二个单词永远不会匹配.

让我们看一个实际的例子.

我不想匹配每个带有"我"和"馅饼"这个词的句子,而不是那两个词之间的"讨厌"这个词.我有这三句话:

i sure like eating pie, but i love donuts <- Want to match this
i sure like eating pie, but i hate donuts <- Want to match this
i sure hate eating pie, but i like donuts <- Don't want to match this
Run Code Online (Sandbox Code Playgroud)

我有这个正则表达式:

^i(?!.*hate).*pie          - have removed the word boundaries for clarity, original is: ^i\b(?!.*\bhate\b).*\bpie\b 
Run Code Online (Sandbox Code Playgroud)

哪个匹配第一个句子,但不匹配第二个句子,因为负向前瞻扫描整个字符串.

有没有办法限制负面前瞻,如果在遇到"讨厌"之前遇到"馅饼",它是否满意?

注意:在我的实现中,此正则表达式之后可能还有其他术语(它是从语法搜索引擎动态构建的),例如:

^i(?!.*hate).*pie.*donuts …
Run Code Online (Sandbox Code Playgroud)

regex lookahead negative-lookahead

8
推荐指数
1
解决办法
5133
查看次数

正则表达式负向前瞻

我正在做一些正规表达体操.我为自己设置了尝试搜索C#代码的任务,其中使用了as-operator而没有在合理的空间内进行空检查.现在我不想解析C#代码.例如,我想捕获诸如的代码片段

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(x1.a == y1.a)
Run Code Online (Sandbox Code Playgroud)

但是,没有捕获

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(x1 == null)
Run Code Online (Sandbox Code Playgroud)

也不是那件事

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(somethingunrelated == null) {...}
    if(x1.a == y1.a)
Run Code Online (Sandbox Code Playgroud)

因此,任何随机的空检查都将被视为"良好检查",因此未被发现.

问题是:我如何匹配某些东西,同时确保在其周围环境中找不到其他东西.

我尝试过天真的方法,寻找'as'然后在150个字符内做一个负面的预测.

\bas\b.{1,150}(?!\b==\s*null\b)
Run Code Online (Sandbox Code Playgroud)

上述正则表达式与所有上述示例相匹配.我的直觉告诉我,问题是前瞻然后做负面预测会发现许多情况,即前瞻没有找到'== null'.

如果我尝试否定整个表达式,那么这也无济于事,因为这将匹配大多数C#代码.

regex negative-lookahead regex-lookarounds

7
推荐指数
1
解决办法
1247
查看次数

在Perl中使用*修饰符进行否定前瞻性断言

如果测试的字符串后跟任意数量的空格(零包括)然后没有跟随,我有(我相信的)负向前瞻断言 <@> *(?!QQQ),我期望匹配.<@>QQQ

但是,如果测试的字符串是<@> QQQ正则表达式匹配.

我不明白为什么会出现这种情况,并希望对此事有任何帮助.

这是一个测试脚本

use warnings;
use strict;

my @strings = ('something <@> QQQ',
               'something <@> RRR',
               'something <@>QQQ' ,
               'something <@>RRR' );


print "$_\n" for map {$_ . " --> " . rep($_) } (@strings);



sub rep {

  my $string = shift;

  $string  =~ s,<@> *(?!QQQ),at w/o ,;
  $string  =~ s,<@> *QQQ,at w/  QQQ,;

  return $string;
}
Run Code Online (Sandbox Code Playgroud)

这打印

something <@> QQQ --> something at w/o  QQQ
something <@> …
Run Code Online (Sandbox Code Playgroud)

regex perl negative-lookahead regex-lookarounds

7
推荐指数
2
解决办法
668
查看次数

正则表达式匹配两组重复数字,其中两个都不允许是相同的数字

伙计们,我正在尝试使用正则表达式处理大量的数字字符串,并匹配特定模式的数字序列,其中某些数字在组中重复.部分要求是确保给定模式的各部分之间的唯一性.

我想要实现的那种匹配的一个例子

ABBBCCDD 
Run Code Online (Sandbox Code Playgroud)

将其解释为一组数字.但A,B,C,D不能相同.每个重复都是我们想要匹配的模式.

我一直在使用带有负面预测的正则表达式作为这种匹配的一部分,它可以工作,但不是所有的时间,我很困惑为什么.我希望有人可以解释为什么会出现故障并提出解决方案.

因此,为了解决ABBBCCDD,我使用负面预测使用组来提出这个RE.

(.)(?!\1{1,7})(.)\2{2}(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}
Run Code Online (Sandbox Code Playgroud)

打破这个..

(.)           single character wildcard group 1 (A)
(?!\1{1,7})   negative look-ahead for 1-7 occurrences of group 1 (A)
(.)           single character wildcard group 2 (B)
\2{2}         A further two occurrences of group 2 (B)
(?!\2{1,4})   Negative look-ahead of 1-4 occurrences of group 2 (B)
(.)           single character wildcard group 3 (C)
\3{1}         One more occurrence of group 3 (C)
(?!\3{1,2})   Negative look-ahead of 1-2 occurrences of group 3 (C)
(.)           single character wildcard …
Run Code Online (Sandbox Code Playgroud)

regex negative-lookahead

7
推荐指数
1
解决办法
853
查看次数

使用正则表达式跳过所有字符,直到找到使用负向前瞻的特定字母序列

我对基本的正则表达式很好,但是我在pos/neg的前方/后方有点迷失.

我正试图从中提取id#:

[keyword stuff=otherstuff id=123 morestuff=stuff]

之前或之后可能会有无限量的"东西".我一直在使用The Regex Coach来帮助调试我尝试过的东西,但我不再向前推进......

到目前为止我有这个:

\[keyword (?:id=([0-9]+))?[^\]]*\]
Run Code Online (Sandbox Code Playgroud)

这会在id之后处理任何额外的属性,但我无法弄清楚如何忽略关键字和id之间的所有内容.我知道我不能去,[^id]* 我相信我需要使用像这样的负面预测,(?!id)*但我想因为它是零宽度,它不会从那里向前移动.这也不起作用:

\[keyword[A-z0-9 =]*(?!id)(?:id=([0-9]+))?[^\]]*\]
Run Code Online (Sandbox Code Playgroud)

我一直在寻找各种例子,但没有找到任何例子.或者也许我有,但他们走到了我的脑海,我甚至没有意识到他们是什么.

救命!谢谢.

编辑:它必须匹配[keyword stuff = otherstuff],其中id =根本不存在,所以我必须在id#group上有1或0.还有其他[otherkeywords id = 32]我不想匹配.该文档需要使用preg_match_all在整个文档中匹配多个[keyword id = 3].

php regex negative-lookahead

6
推荐指数
1
解决办法
7380
查看次数

正则表达式负回顾和超前:等价和性能

我需要一个正则表达式,它只会选择那些不以 .png 或 .css 等特定扩展名结尾的 URL 字符串。

我测试了以下内容:

1)这个使用负回顾:

(?<!\.png|\.css)$
Run Code Online (Sandbox Code Playgroud)

https://regex101.com/r/tW4fO5/1

2)另一个使用负前瞻:

^(?!.*[.]png|.*[.]css$).*$
Run Code Online (Sandbox Code Playgroud)

https://regex101.com/r/qZ7vA4/1

两者似乎都工作正常,但据说 #1(负向后视)在 436 步(见链接)中处理,而 #2(负向后视)据说在 173 步中处理。

所以我的问题是:这是什么意思?会不会影响演出?

最后,这两个正则表达式在功能上真的是等价的吗?

编辑:解决方案摘要

总结一下,考虑到要通过正则表达式排除的字符串结尾的完整列表(一个典型的场景是 Web 服务器设置,其中静态资源由 apache 提供,而动态资源由不同的引擎提供 - 在我的情况下: php-fpm)。

PCRE 正则表达式有两种可能的选择:

1)负面回顾

$(?<!\.(?:ico|gif|jpg|png|css|rss|xml|htm|pdf|zip|txt|ttf)$|(?:js|gz)$|(?:html|woff)$)

https://regex101.com/r/eU9fI6/1

请注意,我使用了几个 OR ed 后视,因为负后视需要固定宽度的模式(即:您不能混合不同长度的模式)。这使得这个选项的编写稍微复杂一些。此外,在我看来,这降低了它的性能。

2)负前瞻

^(?!.*[.](?:js|ico|gif|jpg|png|css|rss|xml|htm|html|pdf|zip|gz|txt|ttf|woff)$).*$

https://regex101.com/r/dP7uD9/1

前瞻比后视略快。这是 100 万次迭代的测试结果:

后视时间 = 18.469825983047 秒
前瞻时间 = 14.316685199738 秒

如果我没有可变长度模式的问题,我会选择后视,因为它看起来更紧凑。反正哪一个都好。最后,我向前看:

<LocationMatch "^(?!.*[.](?:js|ico|gif|jpg|png|css|rss|xml|htm|html|pdf|zip|gz|txt|ttf|woff)$).*$">
    SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://www/srv/www/gioplet/web/public/index.php"
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

regex negative-lookbehind negative-lookahead regex-lookarounds

6
推荐指数
1
解决办法
4486
查看次数

懒惰的量词和前瞻

我正在研究用于在C#中验证URL的正则表达式.现在,我需要的正则表达式必须与http://url中的第一个正则表达不匹配.这是我的第一次尝试:

(https?:\/\/.+?)\/(.+?)(?!https?:\/\/)
Run Code Online (Sandbox Code Playgroud)

但这个正则表达式不起作用(甚至删除(?!https?:\/\/)).以此输入字符串为例:

http://test.test/notwork.http://test
Run Code Online (Sandbox Code Playgroud)

这是我的第一个疑问:为什么捕获组不(.+?)匹配notwork.http://test?懒惰的量词应尽可能少匹配,但为什么不到最后?在这种情况下,我当然错过了一些东西(首先我认为它可能与回溯相关,但我不认为是这种情况),所以我读了这个并找到了解决方案,即使我不确定是最好的因为它说

这种技术没有优于懒惰的点星

无论如何,那个解决方案就是淬火点.这是我的下一次尝试:

(https?:\/\/.+?)\/((?:(?!https?:\/\/).)*)
Run Code Online (Sandbox Code Playgroud)

现在:这个正则表达式正在运行,但不是我想要的方式.只有当网址有效时我才需要匹配.

顺便说一句,我认为我还没有完全理解新正则表达式正在做什么:为什么负面前瞻停留在之前.而不是之后呢? 所以我尝试在它之后移动它.,似乎它匹配url,直到它在第二个http之前找到倒数第二个字符.回到正确的正则表达式,我的假设是负面的前瞻实际上是试图检查.正则表达式已经读过之后的内容,这是对的吗?

其他解决方案已被广泛接受,但我首先更愿意理解这一点.谢谢.

c# regex negative-lookahead

6
推荐指数
1
解决办法
221
查看次数