标签: negative-lookahead

Java正则表达式错误 - 使用组引用进行后瞻

我正在尝试构建一个正则表达式中恰好匹配两次char的正则表达式.这是我制作的正则表达式:

(?<!\1)([^raol1c])\1(?!\1)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它使用了前瞻和后方的底片.但是,像往常一样,后者不起作用; 当它明显具有最大长度(恰好是一个字符)时,java抛出众所周知的异常"后视组没有明显的最大长度".

理想情况下,正则表达式应匹配"hh","jhh","ahh","hhj","hha"而不是"hhh".

有关如何处理此问题并制定解决方法的任何想法?

java regex backreference negative-lookbehind negative-lookahead

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

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

我需要一个正则表达式,它只会选择那些不以 .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
查看次数

grep字符后面没有字符

我正在尝试打印文件中b没有后跟的行e.我尝试使用负面预测,但它不起作用.

 grep  'b(?!e)' filename
 grep '(?!e)b)' filename
 egrep  'b(?!e)' f3.txt
Run Code Online (Sandbox Code Playgroud)

当我运行这些命令时,没有任何显示,没有错误或其他任何东西.我检查了其他人的类似帖子,但无法运行它.

unix linux grep negative-lookahead

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

Mod重写正则表达式负前瞻

我正在尝试匹配所有以 开头的 URI,#/tool_[a-z\-]+# 除非后跟/public. 比如/tool_calculator什么的。

例如,如果 URI 以/tool_store-front或开头,/tool_store-front/anything-but-public那么我想将它们重定向到 HTTPS。因此,/tool_store-front/public不会重定向。

这是我所拥有的,但它不起作用

RewriteCond %{HTTPS} =off
RewriteCond %{REQUEST_URI} ^/?tool_[a-z-]+(?!/public.+) [OR]
RewriteCond %{REQUEST_URI} ^/?secure
RewriteCond %{REQUEST_URI} !^/?secure/public/info
RewriteRule ^(.*)$ https://www.example.org%{REQUEST_URI} [NC,L]
Run Code Online (Sandbox Code Playgroud)

regex .htaccess mod-rewrite negative-lookahead regex-greedy

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

懒惰的量词和前瞻

我正在研究用于在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
查看次数

正则表达式否定前瞻

我需要修改这个正则表达式

href=\"(.*)\"
Run Code Online (Sandbox Code Playgroud)

哪个匹配...

href="./pothole_locator_map.aspx?lang=en-gb&lat=53.153977&lng=-3.533306"
Run Code Online (Sandbox Code Playgroud)

要不匹配这个......

href="./pothole_locator_map.aspx?lang=en-gb&lat=53.153977&lng=-3.533306&returnurl=AbandonedVehicles.aspx"
Run Code Online (Sandbox Code Playgroud)

试过这个,但没有运气

href=\"(.*)\"(?!&returnurl=AbandonedVehicles.aspx)
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.

谢谢,Al.

regex negative-lookahead regex-lookarounds

5
推荐指数
1
解决办法
498
查看次数

REGEXP:捕获组后面没有

我需要匹配以下语句:

Hi there John
Hi there John Doe (jdo)
Run Code Online (Sandbox Code Playgroud)

不匹配这些:

Hi there John Doe is here 
Hi there John is here
Run Code Online (Sandbox Code Playgroud)

所以我认为这个正则表达式会起作用:

^Hi there (.*)(?! is here)$
Run Code Online (Sandbox Code Playgroud)

但它没有 - 我不知道为什么 - 我相信这可能是由捕获组 (.*) 引起的,所以我认为让 * 操作员变得懒惰可能会解决问题......但不是。这个正则表达式也不起作用:

^Hi there (.*?)(?! is here)$
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出我的解决方案方向吗?

解决方案

要检索没有 is here结尾的句子(如Hi there John Doe (the second)),您应该使用(作者@Thorbear):

^Hi there (.*$)(?<! is here)
Run Code Online (Sandbox Code Playgroud)

对于中间包含一些数据的句子(例如 Hi there John Doe (the second) is hereJohn Doe(第二个)是所需的数据)简单的分组就足够了:

^Hi there (.*?) is here$
Run Code Online (Sandbox Code Playgroud)

.

           ???????????????????????????????????????????? …
Run Code Online (Sandbox Code Playgroud)

java regex negative-lookahead capturing-group

5
推荐指数
1
解决办法
2439
查看次数

POSIX正则表达式:排除表达式中的单词?

我正在尝试使用POSIX(扩展)正则表达式创建一个正则表达式,我可以在我的C程序代码中使用它.

具体来说,我想出了以下内容,但是,我想在匹配的表达式中排除"http"这个词.经过一些搜索,看起来POSIX并不像捕获特定字符串那样明显.我在下面的例子中使用了一个叫做"负面看起来"的东西(即(?!http :)).但是,我担心这可能只是POSIX以外的方言中定义的正则表达式可用的东西.是否允许否定前瞻?POSIX中是否允许使用逻辑NOT运算符(即!)?

工作正则表达式示例:

href|HREF|src[[:space:]]=[[:space:]]\"(?!http:)[^\"]+\"[/]

如果我不能像其他方言那样使用负面预测,我可以对上面的正则表达式做什么来过滤掉特定的单词"http:"?理想情况下,有没有任何方法没有逆逻辑,并最终在过程中创建一个荒谬的长正则表达式?(我上面的那个已经很久了,如果可能的话我宁愿看起来不那么混乱)

[注意:我已经在Stack Overflow中查阅了其他相关的主题,但最相关的主题似乎只是"一般地"提出这个问题,这意味着给出的答案并不一定意味着它们在另一个或两个主题中是POSIX风格的==> ,我已经看到了上面的 (?!insertWordToExcludeHere) 负面预测,但我担心它只适用于PHP.)

[注2:我将采取任何POSIX正则表达式措辞,任何帮助将不胜感激.有没有人建议过滤掉"http:"的正则表达式是什么样的,以及它如何适合我当前的正则表达式,取代(?!http :)?]

regex negative-lookahead regex-negation posix-ere

5
推荐指数
1
解决办法
8995
查看次数

不能否定正则表达

我正在尝试在JavaScript中实现以下正则表达式的否定:

^(\d)\1+-(\d)\1+-(\d)\1+$
Run Code Online (Sandbox Code Playgroud)

该表达式符合以下内容:

  • 11111-111-11111
  • 22-2222-2222
  • 55-55555-55

而不是以下内容:

  • 12-22-3345
  • 32-44555-3333

我希望它与那些场景相反.

我尝试了以下正则表达式,但它们不起作用:

^(?!(\d)\1+-(\d)\1+-(\d)\1+)$
^(?!(\d))\1+-(?!(\d))\1+-(?!(\d))\1+$
^(?!(\d)\1+)-(?!(\d)\1+)-(?!(\d)\1+)$
Run Code Online (Sandbox Code Playgroud)

我以为我对前瞻性的前瞻性有了深刻的理解,但显然没有.我在这做错了什么?有人能指出我正确的解决方案吗?

编辑:这是一个乱七八糟的链接当前的正则表达式:https://regex101.com/r/jY9mJ6/1

javascript regex negative-lookahead regex-negation

5
推荐指数
1
解决办法
145
查看次数

正则表达式 - 匹配模式中的单词,电子邮件地址除外

我希望在字符串中找到与特定模式匹配的单词.问题是,如果单词是电子邮件地址的一部分,则应忽略它们.

简化"正确单词"的模式\w+\.\w+- 一个或多个字符,实际句点和另一系列字符.

例如,导致问题的句子是a.a b.b:c.c d.d@e.e.e.

目标是仅匹配[a.a, b.b, c.c].对于我构建的大多数正则表达式,e.e也会返回(因为我使用了一些单词边界匹配).

例如:

>>> re.findall(r"(?:^|\s|\W)(?<!@)(\w+\.\w+)(?!@)\b", "a.a b.b:c.c d.d@e.e.e") ['a.a', 'b.b', 'c.c', 'e.e']

如何只匹配不包含"@"的单词?

python regex negative-lookbehind negative-lookahead

5
推荐指数
1
解决办法
116
查看次数