标签: regex-lookarounds

负面前瞻正则表达式贪婪(为什么.*?太贪心)

我无法理解负前瞻正则表达式的更精细细节.在阅读了Regex前瞻,后视和原子组之后,当我找到这个描述时,我认为我对负向前瞻有了很好的总结:

(?!REGEX_1)REGEX_2

仅在REGEX_1不匹配时匹配; 检查后REGEX_1,搜索REGEX_2开始于同一位置.

希望我理解算法,我做了两句话侮辱; 我想找一个没有一个字的句子.特别...

侮辱: 'Yomama很难看.而且,她闻起来像一只湿狗.

要求:

  • 测试1:返回一个没有'丑陋'的句子.
  • 测试2:返回没有"外观"的句子.
  • 测试3:返回没有'气味'的句子.

我将测试单词分配给了$arg,我过去常常(?:(?![A-Z].*?$arg.*?\.))([A-Z].*?\.)执行测试.

  • (?![A-Z].*?$arg.*?\.) 用测试词拒绝一个句子是一个消极的先行
  • ([A-Z].*?\.)匹配至少一个句子.

关键部分似乎是在理解正则表达式引擎在处理负前瞻后开始匹配的位置.

预期成果:

  • 测试1($ arg ="丑陋"):"而且,她闻起来像一只湿狗."
  • 测试2($ arg ="看起来"):"Yomama很难看."
  • 测试3($ arg ="气味"):"Yomama很难看."

实际结果:

  • 测试1($ arg ="丑陋"):"而且,她闻起来像一只湿狗." (成功)
  • 测试2($ arg ="看起来"):"Yomama很难看." (成功)
  • 测试3($ arg ="气味"):失败,不匹配

起初我认为测试3失败了,因为([A-Z].*?\.)太贪心并且匹配两个句子; 但是,(?:(?![A-Z].*?$arg.*?\.))([A-Z][^\.]*?\.)也没有用.接下来我想知道python否定前瞻实现是否存在问题,但perl给了我完全相同的结果.

最后我找到了解决方案,我不得不.*?通过使用来拒绝表达式中的句点[^\.]*?; 所以这个正则表达式工作:(?:(?![A-Z][^\.]*?$arg[^\.]*?\.))([A-Z][^\.]*?\.)

但是,我有另一个问题; "Yomama很难看." 它里面没有"气味".所以,如果.*?应该是一个非贪婪的比赛,为什么我不能完成测试3 (?:(?![A-Z].*?$arg.*?\.))([A-Z].*?\.)

编辑 …

python regex perl regex-lookarounds

19
推荐指数
1
解决办法
3944
查看次数

使用正则表达式预测,egrep

如果您的文件包含

apples are good
apple cider is also good
Run Code Online (Sandbox Code Playgroud)

为什么egrep '(?=apples)app' file不能拿起任何线路?

在MAC上使用egrep 2.5.1

regex grep regex-lookarounds

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

perl和java正则表达式功能有什么区别?

关于支持哪些正则表达式术语,perl和java之间有什么区别?

这个问题仅与正则表达式隔离,并且特别排除了如何使用正则表达式的差异- 即使用正则表达式的可用函数/方法 - 以及诸如java要求之间的语法差异以逃避反斜杠等.

特别感兴趣的是java对可变长度后视的部分/偶尔支持.

java regex perl regex-lookarounds

18
推荐指数
1
解决办法
7475
查看次数

Java RegEx负面的lookbehind

我有以下Java代码:

Pattern pat = Pattern.compile("(?<!function )\\w+");
Matcher mat = pat.matcher("function example");
System.out.println(mat.find());
Run Code Online (Sandbox Code Playgroud)

为什么mat.find()回归真实?我使用了负面的lookbehind,example之前是function.不应该被丢弃吗?

java regex regex-lookarounds

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

JavaScript:好的部分; 为什么前瞻不好?

我正在阅读Douglas Crockfords Javascript:The Good Parts,我刚刚完成了正则表达式章节.在本章中,他称之为JavaScript \b,积极的前瞻(?=)和消极的前瞻(?!) "不是一个好的部分"

他解释了\b不好的原因(它\w用于单词边界查找,并且\w对于使用unicode字符的任何语言都失败了),这看起来对我来说是一个非常好的理由.

不幸的是,正面和负面前瞻不好的原因被遗漏了,我无法想出一个.掌握正则表达式向我展示了前瞻性所带来的力量(当然也解释了它带来的问题),但我无法想到任何可以将其视为"不是很好的部分"的东西.

任何人都可以解释为什么JavaScript(正|负)前瞻或(正|负)前瞻一般应该被认为是"不好"?

看来我不是唯一有这个问题的人:.

javascript regex regex-lookarounds

17
推荐指数
1
解决办法
3643
查看次数

正则表达式存在一些其顺序无关紧要的单词

我想写一个正则表达式来搜索某些单词的存在,但它们的出现顺序无关紧要.

例如,搜索"Tim"和"stupid".我的正则表达式是Tim.*stupid|stupid.*Tim.但是有可能编写一个更简单的正则表达式(例如,这样两个单词在正则表达式中只出现一次)?

python regex string string-matching regex-lookarounds

16
推荐指数
2
解决办法
8883
查看次数

使用负面lookbehind的正则表达式在Notepad ++中不起作用

我有数以百计的字符串的出现的源文件flecha.jpgflecha1.jpg,但我需要找到其他的事件.jpg图像(即casa.jpg,moto.jpg,等等)

我试过使用带有负向lookbehind的正则表达式,如下所示:

(?<!flecha|flecha1).jpg
Run Code Online (Sandbox Code Playgroud)

但它不起作用!Notepad ++只是说它是一个无效的正则表达式.

我在其他地方尝试了正则表达式并且它有效,这是一个例子,所以我猜这是NPP处理正则表达式或者lookbehinds/lookaheads语法的问题.

那么我如何才能在NPP中获得相同的正则表达式结果呢?

如果有用,我使用Notepad ++版本6.3 Unicode

另外,如果你很善良,那么实现同样的东西的语法是什么,但可选的数字(在这种情况下只有'1')作为我的字符串的后缀?(即使它在NPP中不起作用,只是为了知道)......

我试过(?<!flecha[1]?).jpg但它不起作用.它应该与其他正则表达式相同,请参见此处(RegExr)

regex notepad++ negative-lookbehind regex-lookarounds

15
推荐指数
2
解决办法
9141
查看次数

RegEx - 排除匹配模式

我有以下模式被排除在外.

make it cheaper
make it cheapere
makeitcheaper.com.au
makeitcheaper
making it cheaper
www.make it cheaper
ww.make it cheaper.com
Run Code Online (Sandbox Code Playgroud)

我创建了一个正则表达式以匹配其中任何一个.但是,除了这些之外,我还希望得到其他所有东西.我不知道如何逆转我创建的这个正则表达式.

mak(e|ing) ?it ?cheaper
Run Code Online (Sandbox Code Playgroud)

上面的模式匹配列出的所有字符串.现在我想让它与其他一切相匹配.我该怎么做?

从搜索来看,似乎我需要像负向前瞻/回顾这样的东西.但是,我真的不明白.有人能指出我正确的方向吗?

regex negative-lookahead lookaround regex-lookarounds

15
推荐指数
2
解决办法
6万
查看次数

正则表达式匹配多个负向前瞻

我只是尝试匹配一个字符串(使用Perl正则表达式),如果它不是以"abc:"或"defg:"开头,但我似乎无法弄清楚如何.我尝试过类似的东西

^(?:(?!abc:)|(?!defg:))
Run Code Online (Sandbox Code Playgroud)

regex perl regex-lookarounds

14
推荐指数
2
解决办法
6560
查看次数

带有lookahead的Java正则表达式

有没有办法在java中打印出正则表达式的前瞻部分?

    String test = "hello world this is example";
    Pattern p = Pattern.compile("\\w+\\s(?=\\w+)");
    Matcher m = p.matcher(test);
    while(m.find())
        System.out.println(m.group());
Run Code Online (Sandbox Code Playgroud)

这个片段打印出来:

你好
世界


我想要做的是将这些单词打印成对:

你好世界
世界,这
本是
就是例子

我怎样才能做到这一点?

java regex pattern-matching regex-lookarounds

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