我正在尝试构建一个正则表达式中恰好匹配两次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
Geany关于否定断言的文档使它看起来像是可能的.
作为参考,这是有效的,并给我结果:
pcregrep -r "(?<!= )function\(" src/main-js/
Run Code Online (Sandbox Code Playgroud)
但同样的正则表达式,或任何具有负面背后的正则表达式,从Geany启动时都没有给我任何结果(v 1.24.1)

问题出在哪儿 ?文档错了吗?
精确度:主题不是关于如何避免背后的负面看法,而是关于如何做任何标准的PCRE负面看.
我正在尝试编写一个匹配所有内容的正则表达式但是没有被转义的撇号.考虑以下:
<?php $s = 'Hi everyone, we\'re ready now.'; ?>
Run Code Online (Sandbox Code Playgroud)
我的目标是编写一个基本匹配字符串部分的正则表达式.我在考虑像
/.*'([^']).*/
Run Code Online (Sandbox Code Playgroud)
为了匹配一个简单的字符串,但我一直试图弄清楚如何在撇号上得到负面的lookbehind,以确保它没有反斜杠......
有任何想法吗?
- JMT
我正在使用正则表达式来查找任何URL并相应地链接它们.但是,我不希望链接任何已链接的URL,因此我使用lookbehind来查看URL之前是否有href.但这失败了,因为PHP的前瞻和后瞻不允许使用可变长度量词.
这是匹配的正则表达式:
/\b(?<!href\s*=\s*[\'\"])((?:http:\/\/|www\.)\S*?)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?
编辑:
我还没有对它进行测试,但我认为在单个正则表达式中进行此操作的技巧是在正则表达式中使用条件表达式,这是PCRE支持的.它看起来像这样:
/(href\s*=\s*[\'\"])?(?(1)^|)((?:http:\/\/|www\.)\w[\w\d\.\/]*)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)
关键点在于,如果捕获了href,则由于条件而立即抛出匹配(?(1)^|),这保证不匹配.可能有些问题.我明天会测试一下.
(注意:不是为什么不能在断言后面的零宽度外观中使用重复量词的副本;请参阅文章结尾。)
我正在尝试编写一个grep -P与 B 匹配的(Perl)正则表达式,当它前面没有 A 时——不管是否有中间空格。
所以,我尝试了这种负面的回顾,并在 regex101.com 中进行了测试:
(?<!A)\s*B
Run Code Online (Sandbox Code Playgroud)
这导致“AB”不匹配,这很好,但“A B”确实导致匹配,这不是我想要的。
我不确定这是为什么。它与 \s* 匹配空字符串 "" 的事实有关,因此您可以说 A 和 B 之间存在 \s* 无穷大匹配。但是为什么这会影响 "AB" 但不是“AB”?
以下正则表达式是否是正确的解决方案,如果是,为什么它可以解决问题?
(?<![A\s])\s*B
Run Code Online (Sandbox Code Playgroud)
我之前发布过这个,它被错误地标记为重复的问题。我正在寻找的可变长度的东西是匹配的一部分,而不是负面回顾本身的一部分——所以这与其他问题完全不同。是的,我可以将 \s* 放在负回顾中,但我没有这样做(并且不支持这样做,正如另一个问题所解释的那样)。另外,我对我上面发布的替代正则表达式为什么有效特别感兴趣,因为我知道它有效,但我不确定为什么。另一个问题并没有帮助回答这个问题。
我希望在字符串中找到与特定模式匹配的单词.问题是,如果单词是电子邮件地址的一部分,则应忽略它们.
简化"正确单词"的模式\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']
如何只匹配不包含"@"的单词?
我想找到后面的字符串中没有出现捕获的组的实例:
aaaBbb = CccBbb <- format is valid, skip
aaaDddd = CccDddd <- format is valid, skip
aaaEeee = CccFfff <- format is not valid, match this one only
Run Code Online (Sandbox Code Playgroud)
所以这匹配我不想匹配的行(https://regex101.com/r/lon87L/1)
/^ +\w+([A-Z][a-z+]) += +\w+\1$/mg
Run Code Online (Sandbox Code Playgroud)
我已经在https://www.regular-expressions.info/refadv.html上看到php不支持负面反馈中的反向引用,但正则表达式的其他实现可以.所以像这样的东西会匹配我想要匹配的无效行,但它在php中不起作用:
/^ +\w+([A-Z][a-z+]) += +\w+(?<!\1)$/mg
Run Code Online (Sandbox Code Playgroud)
除了匹配所有三行并循环遍历php foreach中的匹配之外,还有什么可行吗?
我尝试匹配电子邮件地址,但前提是它们不以“ mailto:”开头。我尝试这个正则表达式:
"/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/"
针对此字符串:
'<a href="mailto:someemail@domain.com">EMAIL</a> ... otheremail@domain.com '
我本来只希望抓住'otheremail@domain.com',但我也收到'omeemail@domain.com'-见失踪's'。我不知道这是怎么了。后置断言后,我不能使用正常的正则表达式吗?
我在PHP中的整个示例如下:
$testString = '<a href="mailto:someemail@domain.com">EMAIL</a> ... otheremail@domain.com ';
$pattern = "/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/";
preg_match_all($pattern, $testString, $matches);
echo('<pre>');print_r($matches);echo('</pre>');
Run Code Online (Sandbox Code Playgroud)
谢谢!
我希望这个简单的文本字符串不会被视为匹配:
xyz@xyz:~$ echo xy | perl -n -e 'print if /y(?<!x)/'
xy
Run Code Online (Sandbox Code Playgroud)
但奇怪的是,它是.我也试过@ https://regex101.com/,结果是一样的.它似乎会匹配y,这让我感到困惑.如果我的理解是正确的,那么上面的正则表达式应该只匹配前面没有 a的ys .x
PS:我给出了一个简单的例子.一般来说,我想使用负面的lookbehinds来匹配完整的字符串,而不一定是像x这样的单个字符.
我正在使用Perl正则表达式.
谢谢
我在 Powershell 脚本中有这一行:
if (Select-String -Path "$holidays" -Pattern "(?<!\*)$datestr" -SimpleMatch -Quiet)
$holidays 是一个文本文件,其中我有一些日期:
2023-09-04
2023-11-23
*2023-11-24
2023-12-25
Run Code Online (Sandbox Code Playgroud)
$datestr 是今天日期:2023-11-23
为什么负向后看模式在上面的行中不起作用?
我只是想排除(不匹配)所有以 * 开头的日期
我认为负向回顾中有问题,因为该行:
if (Select-String -Path "$holidays" -Pattern $datestr -SimpleMatch -Quiet)
Run Code Online (Sandbox Code Playgroud)
工作完美 --> 结果是正确的
第一行结果为 false