在我的主目录中,我有一个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 - 你不能互换双负前瞻以获得积极的前瞻.
我正在尝试制作两个匹配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,我只需要解决问题,我认为负面的预测可能是一种方法.
谢谢,
是否可以在正则表达式中进行字符串否定?我需要匹配所有不包含字符串的字符串"..".我知道你可以使用^[^\.]*$匹配所有不包含的字符串,"."但我需要匹配多个字符.我知道我可以简单地匹配一个包含的字符串"..",然后否定匹配的返回值以获得相同的结果,但我只是想知道它是否可能.
在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中以交互方式进行上述操作.)
嗨,我是正则表达式的新手,这可能是一个非常简单的问题(希望如此).
我试图使用一种解决方案3种字符串
我在尝试什么(让字符串为str):
str.match(/(.*)(?!%*)/i)[1]
Run Code Online (Sandbox Code Playgroud)
在我的脑海中听起来像"匹配任何事物的任何实例,直到'%'如果找到它,或者只是匹配任何东西"
在萤火虫的头脑中,它似乎听起来更像是"只是匹配任何东西而完全无视负面前瞻".也是为了让它变得懒惰 - (.*)?似乎没有帮助.
让我们忘记一下,在这种特殊情况下,我只是匹配数字,所以/\d*/我会这样做.我试图了解一般规则,以便我可以随时应用它.
有人会这么善意帮助我吗?
以下正则表达式在子串FTW和ODP之间找到文本.
/FTW(((?!FTW|ODP).)+)ODP+/
Run Code Online (Sandbox Code Playgroud)
什么是(?!...... )怎么办?
我需要有关使用否定前瞻的帮助.我正在使用Notepad ++,我想删除除包含的行之外的所有行<title>(.*)</title>
我尝试了几件事但是没有用.
^.*(?!<title>).*</title>
^.*(?!<title>.*</title>)
Run Code Online (Sandbox Code Playgroud) 我有以下模式被排除在外.
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)
上面的模式匹配列出的所有字符串.现在我想让它与其他一切相匹配.我该怎么做?
从搜索来看,似乎我需要像负向前瞻/回顾这样的东西.但是,我真的不明白.有人能指出我正确的方向吗?
当字符串'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) 我的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模式中缺少什么?