问题标签 [negative-lookbehind]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
279 浏览

python - Python 正则表达式负回溯

我有一个大型的 CT 扫描结果和印象数据库。我正在尝试构建一个正则表达式,它搜索一个整数或浮点数,后跟'mm',它与前面或后面的单词'nodule'相邻。这是我到目前为止的正则表达式:

但是,我需要确保这些发现之前没有之前或之前的测量。放射科医生参考以前的扫描。所以我正在尝试消极的回顾,就像这样:

但是,我无法让它工作。以以下段落为例。

“例如,最大的结节位于右下叶,目前测量为 4.4 毫米(图像#82,系列 3),之前在 2011 年 9 月 1 日测量为 3.6 毫米。”

在这种情况下,我希望正则表达式命中 4.4 毫米而不是 3.6 毫米。此外,如果发现多个命中,我只想保留找到的最大尺寸。例如,

“例如,最大的结节位于右下叶,目前尺寸为 4.4 毫米(图像 #82,系列 3),之前在 2011 年 9 月 1 日测量为 3.6 毫米。发现另一个结节的尺寸为 2.2 毫米。

在这种情况下,我想确保仅识别出 4.4 毫米。

任何帮助将不胜感激。只是无法让这种负面的后视效果发挥作用!谢谢!

0 投票
1 回答
52 浏览

html - 多行正则表达式替换标签内的标签?

我想用标签替换标签内的单行b////标签h2h3h4h5blockquoteh6

所以我想要这个:

替换为:

但前提是它在一个blockquote标签内,该标签位于不同的行上。我认为解决方案必须涉及对结束blockquote标签的后视和对开头的负后视blockquote,但我不确定如何实现这一点。

0 投票
1 回答
95 浏览

ruby - 为什么这种负面的看法是错误的?


它不应该向后看,看看匹配不是以单词或数字开头的吗?为什么它仍然接受 'in' 作为有效匹配?

0 投票
3 回答
594 浏览

python - 正则表达式从文件名列表中查找图像序列

我需要一些关于正则表达式字符串的帮助,以从先前生成的文件名列表中提取任何看起来可能是帧序列的一部分的文件名。

序列中的帧通常具有 3 的最小填充,并且前面会带有 a'.'或 a'_'一个例外情况是:如果文件名仅由数字和.jpg扩展名(例如0001.jpg0002.jpg等)组成。如果可能的话,我想在一行正则表达式中捕获所有这些。

这是我到目前为止所拥有的:

现在我知道这不会执行“前面的._位,而只是在字符串中找到 a._任何地方以返回正数。我尝试了一些负面的后视测试,但无法使语法正常工作。

数据样本是:

我追求的结果是确定了 2 个序列:

  1. GameAssets_.00000.jpgGameAssets_.00024.jpg
  2. 00000.jpg00018.jpg
0 投票
0 回答
26 浏览

javascript - 与 match 一起使用以查找分隔符但实际上在 JavaScript 的结果中排除它们的正则表达式是什么?

这个问题可能比我想要做的更令人困惑。基本上我想获取 html<title元素的内容:

这给了我:

因此,要仅访问文本,我必须使用s[1].

有没有办法只用文本创建匹配,跳过"<title>foobar</title>"?或者换句话说:有没有办法告诉match():“搜索一个用分隔的字符串,<a></a>但忽略结果中的那些分隔符”?

我尝试过各种带有负面回溯等的表达方式,但我并不幸运。我什至不知道这是否是正确的方法。

0 投票
1 回答
1331 浏览

regex - RegExp 匹配行不以 at-symbol 开头

如果我编写这个正则表达式(?<=^[\t ]*@).+,我只能匹配以可选空格(但不是换行符)和 at-symbol 开头的行,而不匹配 at-symbol。

示例: @test匹配“test”,但不匹配“@”。

我正在尝试匹配首先不是空格字符不是 at-symbol 的行。为此,我否定了后视,结果是:(?<!^[\t ]*@).+.

但即使它们的第一个非空格字符是 at 符号,它也会匹配行。

我试过像这样的正则表达式: ^[\t ]*[^@].*, (?<=^[\t ]*[^@]).+, (?<=^[\t ]*)(.(?!@)).*. 所有然后匹配行,即使它们的第一个非空格字符是 at 符号。

如何匹配不以可选空格(不是换行符)和 at 符号开头的行?

谢谢!

0 投票
2 回答
5153 浏览

regex - 正则表达式负后瞻和前瞻:等价和性能

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

我测试了以下内容:

1)这个使用负面的lookbehind:

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

2)另一个使用负前瞻:

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 秒

如果我没有可变长度模式的问题,我会选择后视,因为它看起来更紧凑。无论如何,任何一个都很好。最后,我进行了前瞻:

0 投票
3 回答
236 浏览

regex - 负后向正则表达式 (PERL),中间有可变字符

我在使用负后向正则表达式时遇到问题。我已经阅读了 stackoverflow 结果,恐怕我不太了解它们。

我经营着一个游戏服务器,我有一个工具可以读取用户的聊天记录,如果用户使用了禁用词,就会踢出用户。该工具使用 PERL 正则表达式引擎。

假设我的禁用词是“bag”或“digger”的流行派生词。我可以使用以下正则表达式来匹配包含这些单词的聊天行。

我的实际列表中还有其他词。

但是,我想先提供一个警告,它在聊天中显示为:

车主:不要说“挖掘机”

因此,我尝试使用否定的后视来避免匹配我的禁用词列表,因为它前面有“所有者:” - 但是,如果我指定我在“:”和被禁止的文本之间使用的确切文本,我只能让它工作单词 - 我并不总是这样做,并且经常不小心匹配我自己。

我试过使用:

如果只有空格,这有效,但我真正想要的是不匹配:

所有者:挖掘机

拥有者:挖掘机

店主:别拿包来侮辱

业主:(这里还有什么)挖掘

等等,但匹配:

(其他):(任何被禁止的词,不管冒号后面的内容)

由于零宽度断言(我无法绕开我的脑袋),或者我的 regex-fu 很弱,我无法确定在这种语法中我想要的东西是否可能。

我已经尝试了几个教程,并使用了 regex101 解析器,但我不能完全得到我想要的。请问你能帮忙吗?

0 投票
1 回答
69 浏览

javascript - javascript 正则表达式匹配不在特定属性内的任何内容

假设我想匹配 url,它们不在 html 标签的特定属性集中。

我只想匹配 url3 和 url4,所以我尝试了类似的方法:

问题是消极的前瞻性断言在它之前需要一些东西,我不能确保数字不能在引号内,因为它仍然是有效的,所以我没有任何合理的理由来支持这个消极的前瞻性断言。

如果我能够在断言后面使用否定的外观,那将非常容易,但我使用的是不支持它的 javascript,所以我有点卡住并寻求有关如何实现这一点的帮助。

我寻找仅正则表达式的解决方案。

编辑:

我用来查找网址的网址正则表达式:

0 投票
1 回答
60 浏览

regex - 正则表达式匹配特定格式 - 一个大写单词但不是两个

案例:

1 和 2 应该匹配,但 3 和 6 不应该匹配。他们在 () 之前的部分中有两个词。我试图做一个 (?!\s) 或 (?!\b) 来忽略下一个单词,但它似乎只回溯到前一个字符并忽略它。

结果

更新:

一般模式是

人只能有一个大写的名字,而一个 NPC 可以有两个不同大小写的名字......国王 Jheric vs wolfen berserker vs zealot Warriors。

它必须模糊的原因是它必须匹配模式,例如

更新 2:

这解决了上面列出的所有情况,包括原始情况,除了第一个或第二个“事物”有两个单词并且其中至少一个是大写的。