标签: negative-lookahead

正则表达式负向前瞻

在我的主目录中,我有一个drupal-6.14文件夹,其中包含Drupal平台.

从这个目录我使用以下命令:

find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
Run Code Online (Sandbox Code Playgroud)

这个命令的作用是gzips文件夹drupal-6.14,不包括drupal-6.14/sites/ 除了sites/all和sites/default之外的所有子文件夹.

我的问题是关于正则表达式:

grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)

该表达式可以排除我想要排除的所有文件夹,但我不太明白为什么.

使用正则表达式是一项常见任务

匹配所有字符串,但包含子模式x的字符串除外.或者换句话说,否定子模式.

我(想)我明白解决这些问题的一般策略是使用否定的前瞻,但我从来没有理解到正面和负面的外观(前瞻/后退)是如何工作的.

多年来,我已经阅读了很多网站.PHP和Python正则表达式手册,其他页面,如http://www.regular-expressions.info/lookaround.html等,但我从来没有真正理解它们.

有人可以解释,这是如何工作的,也许可以提供一些类似的例子来做类似的事情?

- 更新一:

关于Andomar的回应:双重否定前瞻可以更简洁地表达为单一的积极前瞻性陈述:

即是:

'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)

相当于:

'drupal-6.14/(?=sites(?:/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)

???

- 更新二:

根据@andomar和@alan moore - 你不能互换双负前瞻以获得积极的前瞻.

regex lookahead negative-lookahead

57
推荐指数
3
解决办法
9万
查看次数

Java正则表达式:否定前瞻

我正在尝试制作两个匹配URI的正则表达式.这些URI的格式为:/foo/someVariableData/foo/someVariableData/bar/someOtherVariableData

我需要两个正则表达式.每个都需要匹配一个而不是另一个.

我最初提出的正则表达式是: /foo/.+/foo/.+/bar/.+.

我认为第二个正则表达式很好.它只匹配第二个字符串.然而,第一个正则表达式匹配两者.所以,我开始玩(第一次)负向前瞻.我设计了正则表达式/foo/.+(?!bar)并设置以下代码来测试它

public static void main(String[] args) {
    String shouldWork = "/foo/abc123doremi";
    String shouldntWork = "/foo/abc123doremi/bar/def456fasola";
    String regex = "/foo/.+(?!bar)";
    System.out.println("ShouldWork: " + shouldWork.matches(regex));
    System.out.println("ShouldntWork: " + shouldntWork.matches(regex));
}
Run Code Online (Sandbox Code Playgroud)

当然,他们两个都决心true.

谁知道我做错了什么?我不需要使用Negative lookahead,我只需要解决问题,我认为负面的预测可能是一种方法.

谢谢,

java regex negative-lookahead regex-lookarounds

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

使用正则表达式的字符串否定

是否可以在正则表达式中进行字符串否定?我需要匹配所有不包含字符串的字符串"..".我知道你可以使用^[^\.]*$匹配所有不包含的字符串,"."但我需要匹配多个字符.我知道我可以简单地匹配一个包含的字符串"..",然后否定匹配的返回值以获得相同的结果,但我只是想知道它是否可能.

regex negation lookahead negative-lookahead

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

有没有办法在vim正则表达式中做负面的预测?

在Vim中,有没有办法搜索匹配的行abc但是xyz后面还不包含该行?所以以下几行将匹配:

The abc is the best
The first three letters are abc
Run Code Online (Sandbox Code Playgroud)

并且以下内容不匹配:

The abc is the best but xyz is cheaper
The first three letters are abc and the last are xyz
Run Code Online (Sandbox Code Playgroud)

我知道如下语法:

/abc\(xyz\)\@!
Run Code Online (Sandbox Code Playgroud)

但这只是避免匹配,abcxyz而不是中间是否有任何东西,例如abc-xyz.运用

/abc.*\(xyz\)\@!
Run Code Online (Sandbox Code Playgroud)

也不起作用,因为后面的线路中有许多位置xyz不匹配.

(我应该注意,在命令行上我会做类似的事情,grep abc <infile | grep -v xyz但我想在Vim中以交互方式进行上述操作.)

regex vim negative-lookahead

28
推荐指数
3
解决办法
5794
查看次数

Javascript正则表达式:匹配任何东西直到某些东西(如果它存在)

嗨,我是正则表达式的新手,这可能是一个非常简单的问题(希望如此).

我试图使用一种解决方案3种字符串

  • "45%",预期结果:"45"
  • "45",预期结果:"45"
  • "", 预期结果: ""

我在尝试什么(让字符串为str):

str.match(/(.*)(?!%*)/i)[1]
Run Code Online (Sandbox Code Playgroud)

在我的脑海中听起来像"匹配任何事物的任何实例,直到'%'如果找到它,或者只是匹配任何东西"

在萤火虫的头脑中,它似乎听起来更像是"只是匹配任何东西而完全无视负面前瞻".也是为了让它变得懒惰 - (.*)?似乎没有帮助.

让我们忘记一下,在这种特殊情况下,我只是匹配数字,所以/\d*/我会这样做.我试图了解一般规则,以便我可以随时应用它.

有人会这么善意帮助我吗?

javascript regex negative-lookahead

17
推荐指数
2
解决办法
3万
查看次数

正则表达式:(?!...)是什么意思?

以下正则表达式在子串FTW和ODP之间找到文本.

/FTW(((?!FTW|ODP).)+)ODP+/
Run Code Online (Sandbox Code Playgroud)

什么是(?!...... )怎么办?

regex negative-lookahead

16
推荐指数
3
解决办法
7279
查看次数

如何在正则表达式中使用否定前瞻删除不需要的行

我需要有关使用否定前瞻的帮助.我正在使用Notepad ++,我想删除除包含的行之外的所有行<title>(.*)</title>

我尝试了几件事但是没有用.

^.*(?!<title>).*</title>
^.*(?!<title>.*</title>)
Run Code Online (Sandbox Code Playgroud)

regex notepad++ negative-lookbehind negative-lookahead

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

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万
查看次数

负向前看python正则表达式

当字符串'02 d0'没有出现在字符串中的特定位置时,我想正则表达式匹配一个字节序列.不能出现这个两个字节的字符串的位置是从右侧第0个字节开始的字节位置6和7.

这是我一直用于测试的内容:

#!/usr/bin/python
import re

p0 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (([^0])|    (0[^2])|(02 [^d])|(02 d[^0])) 01 c2 [\da-f]{2} [\da-f]{2} [\da-f]{2} 23')
p1 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (([^0])|(0[^2])|(02 [^d])|(02 d[^0])) 01')
p2 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (([^0])|(0[^2])|(02 [^d])|(02 d[^0]))')
p3 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (?!02 d0) 01')
p4 = re.compile('^24 [\da-f]{2} 03 (01|03) [\da-f]{2} [\da-f]{2} [\da-f]{2} (?!02 d0)')

yes = '24 0f 03 01 42 …
Run Code Online (Sandbox Code Playgroud)

python regex negative-lookahead

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

grep和perl的正/负前瞻

我的login.txt文件包含以下条目

abc def
abc 123
def abc
abc de
tha ewe
Run Code Online (Sandbox Code Playgroud)

当我使用perl做正向前瞻时,我得到以下结果

cat login.txt | perl -ne 'print if /(?)abc\s(?=def)/'
abc def
Run Code Online (Sandbox Code Playgroud)

当我使用grep时,我得到以下结果

cat login.txt | grep -P '(?<=abc)\s(?=def)'
abc def
Run Code Online (Sandbox Code Playgroud)

来自perl和grep的负面外观结果如下.

 cat login | perl -ne 'print if /(?)abc\s(?!def)/'
abc 123
def abc
abc de
Run Code Online (Sandbox Code Playgroud)

grep结果

cat login.txt | grep -P '(?<=abc)\s(?!def)'
abc 123
abc de
Run Code Online (Sandbox Code Playgroud)

perl与def abc匹配负向前瞻.但它不应该与def abc匹配,因为我正在检查abc然后def模式.grep返回正确的结果.

在我的perl模式中缺少什么?

regex bash perl grep negative-lookahead

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