我正在尝试构建一个正则表达式中恰好匹配两次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
我需要一个正则表达式,它只会选择那些不以 .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
我正在尝试打印文件中b没有后跟的行e.我尝试使用负面预测,但它不起作用.
grep 'b(?!e)' filename
grep '(?!e)b)' filename
egrep 'b(?!e)' f3.txt
Run Code Online (Sandbox Code Playgroud)
当我运行这些命令时,没有任何显示,没有错误或其他任何东西.我检查了其他人的类似帖子,但无法运行它.
我正在尝试匹配所有以 开头的 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) 我正在研究用于在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之前找到倒数第二个字符.回到正确的正则表达式,我的假设是负面的前瞻实际上是试图检查.正则表达式已经读过之后的内容,这是对的吗?
其他解决方案已被广泛接受,但我首先更愿意理解这一点.谢谢.
我需要修改这个正则表达式
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.
我需要匹配以下语句:
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 here,John Doe(第二个)是所需的数据)简单的分组就足够了:
^Hi there (.*?) is here$
Run Code Online (Sandbox Code Playgroud)
.
???????????????????????????????????????????? …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用POSIX(扩展)正则表达式创建一个正则表达式,我可以在我的C程序代码中使用它.
具体来说,我想出了以下内容,但是,我想在匹配的表达式中排除"http"这个词.经过一些搜索,看起来POSIX并不像捕获特定字符串那样明显.我在下面的例子中使用了一个叫做"负面看起来"的东西(即(?!http :)).但是,我担心这可能只是POSIX以外的方言中定义的正则表达式可用的东西.是否允许否定前瞻?POSIX中是否允许使用逻辑NOT运算符(即!)?
工作正则表达式示例:
href|HREF|src[[:space:]]=[[:space:]]\"(?!http:)[^\"]+\"[/]
如果我不能像其他方言那样使用负面预测,我可以对上面的正则表达式做什么来过滤掉特定的单词"http:"?理想情况下,有没有任何方法没有逆逻辑,并最终在过程中创建一个荒谬的长正则表达式?(我上面的那个已经很久了,如果可能的话我宁愿看起来不那么混乱)
[注意:我已经在Stack Overflow中查阅了其他相关的主题,但最相关的主题似乎只是"一般地"提出这个问题,这意味着给出的答案并不一定意味着它们在另一个或两个主题中是POSIX风格的==> ,我已经看到了上面的 (?!insertWordToExcludeHere) 负面预测,但我担心它只适用于PHP.)
[注2:我将采取任何POSIX正则表达式措辞,任何帮助将不胜感激.有没有人建议过滤掉"http:"的正则表达式是什么样的,以及它如何适合我当前的正则表达式,取代(?!http :)?]
我正在尝试在JavaScript中实现以下正则表达式的否定:
^(\d)\1+-(\d)\1+-(\d)\1+$
Run Code Online (Sandbox Code Playgroud)
该表达式符合以下内容:
而不是以下内容:
我希望它与那些场景相反.
我尝试了以下正则表达式,但它们不起作用:
^(?!(\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
我希望在字符串中找到与特定模式匹配的单词.问题是,如果单词是电子邮件地址的一部分,则应忽略它们.
简化"正确单词"的模式\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']
如何只匹配不包含"@"的单词?
regex ×9
java ×2
.htaccess ×1
c# ×1
grep ×1
javascript ×1
linux ×1
mod-rewrite ×1
posix-ere ×1
python ×1
regex-greedy ×1
unix ×1