亚马逊食人族?揭开食人族的恐怖面纱?不再吃人

作者:小菜 更新时间:2022-12-12 点击数:
简介:在三十多年前,一部叫做《亚马逊食人族》的电影上映,瞬间吸引了人们的注意,加上近年重映以及电影厂商的大力

【菜科解读】

在三十多年前,一部叫做《亚马逊食人族》的电影上映,瞬间吸引了人们的注意,加上近年重映以及电影厂商的大力推荐渲染。

都使得这部典型的美国B级制作电影推上风口浪尖,那么小编就通过这部电影来介绍,关于亚马逊食人族的缘由。

电影《亚马逊食人族》故事是讲述三个年青人,到南美的巴拉圭阿马逊流域找寻相传食人族的下落,并要证明这个世界并无食人族,食人族的流传只是西方文明的诬蔑云云。

他们在森林找寻族人的过程中遇见了两个白种男子,这两个白种男子说他们差点遭食人族吃了。

事实上,这两个白种男子曾经在那个所谓食人族大开杀戒,杀害族人。

族人原本是善良无邪的,现在他们要报复等这种剧情跌宕起伏的电影。

亚马逊食人族真的有吗?

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

虽然电影宣传商一再表明这是一部纪录片,土人杀人与食人场面都是无花无假的。

看过影片后,虽然这套片模仿纪录片的拍摄手法,尤其是食人族部分。

但只要细心看便会知道,整套片其实都是“做戏”。

那么亚马逊真的存在食人族吗?简直比现代的吃人狂魔贾文革还要变态啊!

首先我们要明白什么是食人族,简单的理解就是有一个喜欢吃人的民族,他们在吃人的时候并没有悔恨自责心理,更多将吃人当作一种传统文化对待。

亚马逊食人族是否存在,我们先从历史文献记载来看。

2001年10月,七名美国考古学家在一名叫比尔的富翁资助下,开始正式研究食人族这个课题,研究小组被称为比尔小组。

他们收获还是不小的,首先有人在墨西哥北部的杜兰戈州山区找到了很多“食人族”存在的证据--三十多根人类骨头,考究其年代应是1425年以后的,这些骨头被挖出来之前,都埋在海拔近万米的洞穴上。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

经过专家们仔细研究,他们发现其中至少八成以上的骨头都被烹煮和切割过,由此他们能肯定,当时居住在这里的Xiximes族就是食人族无疑。

根据20世纪英国传教士们留下的记载表明,当时的Xiximes族人们普遍认为,在一场战斗结束之后,如果能把敌人的尸体吃掉,再把骨头清洗干净,最后在祭奠仪式上供奉这些骨头,那么就能确保本部落第二年风调雨顺、五谷丰登。

为了更好地开展研究,七名科学家分成两组,分别冒险深入南美亚马逊盆地和非洲的巴布亚新几内亚,去寻找传说中的Xiximes族。

Xiximes也就是现在的加勒比人,他们是拉丁美洲印第安人的一个分支,主要分布在亚马逊盆地、圭亚那高原和加勒比地区的低地。

他们被分为海岛和大陆两支,海岛的人已经所剩无几,而在大陆上的现在散布在圭亚那、委内瑞拉和巴西等国家,仍然使用加勒比语,但没有自己的文字。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

前往亚马逊的三名科学家们在当地向导和保镖的带领下,乘船顺着亚马逊的众多河流深入丛林中,用卫星电话和设在玛瑙斯的驻地联系。

五天后他们与驻地失去联络,直到二十六天后,课题小组派出的搜索队才在丛林入口处找到他们,个个惊魂未定,以下是根据他们的回忆整理的记录。

科学家文森特回忆道:“我们在向导的带领下进入丛林,贪婪的向导想多索取报酬,我们不答应,结果他就把我们扔在丛林中不管了,临走的时候还偷走了地图和GPS仪器,我们没想到还真撞进了加勒比人的部落村中。

那时候加勒比人正好与另外一个部族的人打仗,他们用人骨制成弓箭和长矛,还有用石片磨成的大砍刀。

打了胜仗抓到很多敌人,加勒比人把活着的男性俘虏都带回村里,先是把他们串在长矛上,让他们哀号几天几夜而死,然后再吃掉。

”文森特等三人不幸被加勒比人抓到,成了俘虏,也许是他们的穿着打扮令加勒比人感到新奇,加勒比人并没有急于将三人吃掉,而是把他们绑在村中的大树上。

这样一来,三名科学家亲眼目睹了以上他们所讲述的那些恐怖场面。

在某个下着大雨的夜晚,加勒比人在将三人转移到草屋内时,三人乘机打昏对方,这才逃了出来,如果不是搜索小组幸运地遇到他们,这三人恐怕早就被困死在亚马逊了。

食人族现在还有吗

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

#p#分页标题#e#

在现实社会中依旧存在着食人族吗?答案是“是”。

美国探险家大胆前往新几内亚岛探险,在那里不仅发现了食人族,还与他们朝夕相处。

居住在印尼新几内亚岛上的食人族被称为“科罗瓦伊人”,他们可能是地球上仅存的食人部落。

保罗?拉斐尔在出发之前,已经看了很多关于科罗瓦伊人的书和报道。

跟科罗瓦伊人息息相关的是一种高大的棕榈科树木,名叫“西谷椰子”树,它们最高可达30-40米。

科罗瓦伊人的衣食住行一刻也离不开它,因此科罗瓦伊人称之为“生命树”。

科罗瓦伊人的饮食也主要来自于西谷椰子树:它的汁液可直接饮用,而用西谷椰子树树干的髓质制成的面粉则可以做成各种科罗瓦伊人喜爱的食品。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

另外,科罗瓦伊人还用西谷椰子树的木头制作各种工具,并用西谷椰子树的棘刺制作装饰品。

食人族住在哪儿?科罗瓦伊人的房室建在西谷椰子树的树顶上。

人们用藤条将屋架和地板固定在根树干上,然后再用树皮来加固墙壁、地板和隔板,并将折叠起来的西谷椰子树树叶固定在屋架上面作屋顶。

铺在地板上的厚厚的西谷椰子树树叶便是科罗瓦伊人的床,躺在上面睡觉可以避免虱、蚤、臭虫等小虫叮咬的烦恼。

另外,屋子里面挂满了装饰品:鸽子羽毛、野猪的颌骨、蛇和鱼的骨架等等。

食人族生活状况如何?科罗瓦伊人的寿命非常短,只有30-35岁而已。

造成他们短寿的原因除了部族间的斗争杀戮外,主要就是这里特殊的气候条件很容易引起疟疾、肺结核等传染病,而科罗瓦伊人不懂医学,面对疾病往往坐以待毙。

科罗瓦伊人曾一度濒临灭绝。

科罗瓦伊的文化中,对于死亡只有两种定义:一是被敌人的利箭给射死;另一则是遭到诅咒而死。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

食人族所有人都吃人?在食人肉的聚会上,小孩子原则上是不准参加的。

除了小孩子,男女都可以吃“巫师”的肉。

在吃掉“巫师”后,科罗瓦伊人会将骨头放在路边,然后聚集在自己的树屋下面,彻夜用棍棒敲打树屋的支柱,警告其他的“巫师”不要出来。

食人族现在还吃人吗?近年来吃“巫师”的现象在科罗瓦伊人中越来越少。

除了他们自己慢慢认识到这种行为的残忍之外,另一个原因是因为印尼警察曾经因此惩罚过他们。

上世纪年代,科罗瓦伊人在吃掉了又一个“巫师”后,印尼警方曾强势介入,逮捕了几个为首的行凶者,将他们关进放在池塘中的大铁笼里,并进行了严酷的体罚。

从那以后,科罗瓦伊人吃人的现象就减少很多了。

研究者们认为,食人族吃人除去饥饿的原因还有将近20种原因:报仇、报恩、雪恨、震慑对手、证实誓言、谄媚主子、偏嗜人肉、为治病强身、宗教迷信、人祭或者为了显示勇猛等等。

宗教以及信仰都很有可能成为食人族食人的原因,在为数众多的研究文献中,人们提到食人族吞食人肉的目的除了滋养身体之外,还带有自我转化、显示权力,或者将吃与被吃者的关系仪式化等动机。

换句话说,与吃其他食物一样,食人者往往希望分享食物的功效。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

在现代社会当中,高度发达文明社会当中,很少有人还会为了食物而去吃人。

但也有新闻报道,德国有一些异物癖的爱好者,还是喜欢吃人肉,而且还偷偷滴售卖。

小编看到这样的新闻就感到脊梁根儿发凉。

最近经常在电视上看到水中贵族百岁山的广告,视频的主角就是一位白发老大爷和一位俊俏的美少女,然而我一直也没看懂百岁山的广告,网友也都纷纷表示:百岁山广告画面唯美、格调雅致,但是看不懂广告讲述的故事情节。

为了一探究竟,1316世界之最小编也是搜集了不少资料,最终不负有心人,终于让小编弄懂了百岁石广告的整个含义,没想到广告里讲诉的是这样一个凄美的爱情故事,下面我们就一起看看吧。

在讲百岁山广告故事之前,还是先把这个广告短片再看一遍:

好了,短片看完了,我们就开始说说百岁山广告里的含义和故事吧。

百岁山广告的故事背景#p#分页标题#e#

1650年,斯德哥尔摩的街头,52岁的笛卡尔邂逅了18岁的瑞典公主克里斯汀。

那时,落魄、一文不名的笛卡尔过着乞讨的生活,全部的财产只有身上穿的破破烂烂的衣服和随身所带的几本数学书籍。

生性清高的笛卡尔从不开口请求路人施舍,他只是默默地低头在纸上写写画画,潜心于他的数学世界。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

一个宁静的午后,笛卡尔照例坐在街头,沐浴在阳光中研究数学问题,突然,有人来到他身旁,拍了拍他的肩膀,“你在干什么呢?”扭过头,笛卡尔看到一张年轻秀丽的脸庞,一双清澈的眼睛如湛蓝的湖水,楚楚动人,长长的睫毛一眨一眨的,她就是瑞典的小公主,国王最宠爱的女儿克里斯汀。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

她蹲下身,拿过笛卡尔的数学书和草稿纸,和他交谈起来。

言谈中,他发现这个小女孩思维敏捷,对数学有着浓厚的兴趣。

和女孩道别后,笛卡尔渐渐忘却了这件事,依旧每天坐在街头写写画画。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

几天后,他意外地接到通知,国王聘请他做小公主的数学老师,满心疑惑的笛卡尔跟随前来通知的侍卫一起来到皇宫,在会客厅等候的时候,他听到了从远处传来银铃般的笑声。

转过身,他看到了前几天在街头偶遇的女孩子,慌忙中,他赶紧低头行礼。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

从此,他便当上了公主的数学老师。

公主的数学在笛卡尔的悉心指导下突飞猛进,他们之间也开始变得亲密起来。

笛卡尔向她介绍了他研究的新领域——直角坐标系。

通过它,代数和几何可以结合起来,也就是日后笛卡尔创立的解析几何的雏形。

在笛卡尔的带领下,克里斯汀走进了奇妙的坐标世界,她对曲线着了迷。

每天的形影不离也使他们彼此产生了爱慕之心。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

在瑞典这个浪漫的国度里,一段纯粹、美好的爱情悄然萌发。

然而,没过多久,他们的恋情传到了国王的耳朵里,过往大怒,下令马上将笛卡尔处死。

在克里斯汀的苦苦哀求下,国王将他放逐回国,公主被软禁在宫中。

当时,欧洲大陆正在流行黑死病。

身体孱弱的笛卡尔回到法国后不久,遍染上重病。

在生命进入倒计时的那段日子,他日夜思念公主,每天坚持给她写信,盼望着她的回音。

然而,这些信都被国王拦截下来,公主一直没有收到他的任何消息。

在笛卡尔给克里斯汀寄出第十三封信后,他永远地离开了这个世界。

此时,被软禁在宫中的小公主依然徘徊在皇宫的走廊里,思念着远方的情人。

这最后的一封信上没有写一句话,只有一个方程序:r=a(1-sinθ)。

国王看不懂,以为这个方程里隐藏着两个人不可告人的秘密,遍把全城的数学家召集到皇宫,但是没有人能解开这个函数式。

他不忍看着心爱的女儿每天闷闷不乐,便把这封信给了她。

拿到信的克里斯汀欣喜若狂,她立即明白了恋人的意图,找来纸和笔,着手把方程图形画了出来,一颗心型图案出现在眼前,克里斯汀不禁流下感动的泪水,这条曲线就是着名的“心形线”。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

国王去世后,克里斯汀继承王位,登基后,她便立刻派人去法国寻找心上人的下落,收到的却是笛卡尔去世的消息,留下了一个永远的遗憾……这封享誉世界的另类情书,至今还保存在欧洲笛卡尔纪念馆里,纪念着这段唯美的爱情。

亚马逊食人族是真的吗 揭开食人族的恐怖面纱 不再吃人

而这则广告里撤换的概念就是把百岁山的水比喻成这封另类情书,意喻“经典、浪漫、难忘、瞩目”。

——你就是我的百岁山……看完这个,小编瞬间觉得没有文化太可怕了!以前还总认为这什么破广告,看都看不懂,其实是自己太LOW!哦,卖噶!

美图秀秀教程之照片披上面纱,打造MV魅惑冷色调

色调是照片的重要特征之一,它能富于照片另类时尚、焕然一新的感觉。

而每种色调都应该有个贴合照片主题的主打色,比如在一些摇滚金属乐的MV中,经常会用到以蓝色为基础的冷色调,视觉上给人冷艳、魅惑之感!喜欢这样的色调吗?这里笔者就用“美图秀秀”软件,给大家分享下如何轻松调出质感十足的MV冷色调! 美图秀秀v3.9.6.1004官方正式版 授权:免费软件 大小:28.4M 语言: 简体先看看对比效果图:图1要做这样的MV色调绘效果,首先要选好照片素材,比如一些像素较高的清晰照片,当然人物造型要炫酷一点的才能贴合主题。

接着就来看看如何调色吧:1、在软件下打开待处理的照片,进入“美化”菜单下,选择“影楼-冷蓝”特效,并将透明度默认为100%,一键轻松更改照片的色调。

图22、经过上一步“冷蓝”特效的处理,可能有点偏色,适当降低“色彩饱和度”,打造偏蓝色的淡彩效果。

图312在本页阅读全文 本文导航 第1页: 首页 第2页: 经典LOMO”特效 美图,秀秀,教程,之,照片,披上,面纱,打造,魅惑,

揭开正则表达式的奇怪面纱

引言正则表达式(regular expression)就是用一个 字符串 来描述一个特征,然后去验证另一个 字符串 是否符合这个特征。

比如 表达式 ab+ 描述的特征是 一个 ‘a‘ 和 任意个 ‘b‘ ,那么 ‘ab‘, ‘abb‘, ‘abbbbbbbbbb‘ 都符合这个特征。

正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。

(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。

(3)用来替换,比普通的替换更强大。

正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。

之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。

文章中的每一个举例,都可以点击进入到测试页面进行测试。

闲话少说,开始。

1. 正则表达式规则1.1 普通字符字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。

表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。

(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)举例2:表达式 "bcd",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。

1.2 简单的转义字符一些不便书写的字符,采用在前面加 "\" 的方法。

这些字符其实我们都已经熟知了。

还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "\" 后,就代表该符号本身。

比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "\^" 和 "\$"。

这些转义字符的匹配方法与 "普通字符" 是类似的。

也是匹配与之相同的一个字符。

举例1:表达式 "\$d",在匹配字符串 "abc$de" 时,匹配结果是:成功;匹配到的内容是:"$d";匹配到的位置是:开始于3,结束于5。

1.3 能够与 ‘多种字符‘ 匹配的表达式正则表达式中的一些表示方法,可以匹配 ‘多种字符‘ 其中的任意一个字符。

比如,表达式 "\d" 可以匹配任意一个数字。

虽然可以匹配其中任意字符,但是只能是一个,不是多个。

这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。

举例1:表达式 "\d\d",在匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"12";匹配到的位置是:开始于3,结束于5。

举例2:表达式 "a.\d",在匹配 "aaa100" 时,匹配的结果是:成功;匹配到的内容是:"aa1";匹配到的位置是:开始于1,结束于4。

1.4 自定义能够匹配 ‘多种字符‘ 的表达式使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。

用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。

同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

举例1:表达式 "[bcd][bcd]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"bc";匹配到的位置是:开始于1,结束于3。

举例2:表达式 "[^abc]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"1";匹配到的位置是:开始于3,结束于4。

1.5 修饰匹配次数的特殊符号前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。

如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。

使用方法是:"次数修饰"放在"被修饰的表达式"后边。

比如:"[bcd][bcd]" 可以写成 "[bcd]{2}"。

举例1:表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时,匹配的结果是:成功;匹配到的内容是:"12.5";匹配到的位置是:开始于10,结束于14。

举例2:表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时,匹配的结果是:成功;匹配到的内容是:"goooooogle";匹配到的位置是:开始于7,结束于17。

1.6 其他一些代表抽象意义的特殊符号一些符号在表达式中代表抽象的特殊意义:进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。

举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。

因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,比如:"aaa xxx xxx"。

举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。

因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"。

举例3:表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。

进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。

举例4:表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。

举例5:表达式 "Tom|Jack" 在匹配字符串 "I‘m Tom, he is Jack" 时,匹配结果是:成功;匹配到的内容是:"Tom";匹配到的位置是:开始于4,结束于7。

匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack";匹配到的位置时:开始于15,结束于19。

举例6:表达式 "(go\s*)+" 在匹配 "Let‘s go go go!" 时,匹配结果是:成功;匹配到内容是:"go go go";匹配到的位置是:开始于6,结束于14。

举例7:表达式 "¥(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的结果是:成功;匹配到的内容是:"¥20.5";匹配到的位置是:开始于6,结束于10。

单独获取括号范围匹配到的内容是:"20.5"。

2.1 匹配次数中的贪婪与非贪婪 在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。

这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。

比如,针对文本 "dxxxdxxxd",举例如下: "\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。

虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d" 由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。

虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。

同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。

这种匹配原则就叫作 "贪婪" 模式。

非贪婪模式: 在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。

这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。

如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。

举例如下,针对文本 "dxxxdxxxd" 举例: 为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。

因此,结果是:"\w+?" 匹配 "xxx" 举例1:表达式 "(.*)" 与字符串 "aa bb" 匹配时,匹配的结果是:成功;匹配到的内容是 "aa bb" 整个字符串,表达式中的 "" 将与字符串中最后一个 "" 匹配。

举例2:相比之下,表达式 "(.*?)" 匹配举例1中同样的字符串时,将只得到 "aa",再次匹配下一个时,可以得到第二个 "bb"。

2.2 反向引用 \1, \2... 表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。

在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。

这一点,在前面的举例中,已经多次展示了。

在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。

比如前面的 "(.*?)"。

其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。

表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。

引用方法是 "\" 加上一个数字。

"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串 以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。

换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

举例如下: 举例1:表达式 "(‘|")(.*?)(\1)" 在匹配 " ‘Hello‘, "World" " 时,匹配结果是:成功;匹配到的内容是:" ‘Hello‘ "。

再次匹配下一个时,可以匹配到 " "World" "。

举例2:表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。

再次匹配下一个时,将得到 999999999。

这个表达式要求 "\w" 范围的字符至少重复5次,注意与 "\w{5,}" 之间的区别。

举例3:表达式 "(\w+)\s*(\w+(=(‘|").*?\4)?\s*)*>.*?\1>" 在匹配 "" 时,匹配结果是成功。

如果 "" 与 "" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。

2.3 预搜索,不匹配;反向预搜索,不匹配 前面的章节中,我讲到了几个代表抽象意义的特殊符号:"^","$","\b"。

它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。

理解到这个概念以后,本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的,更加灵活的表示方法。

正向预搜索:"(?=xxxxx)","(?!xxxxx)" 格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。

因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。

这就类似 "\b",本身不匹配任何字符。

"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。

举例1:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。

举例2:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。

这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。

当然,这个表达式可以不这样写,在此的目的是作为演示之用。

格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。

举例3:表达式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有 "stop",则匹配整个字符串。

举例4:表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时,只能匹配 "do"。

在本条举例中,"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。

反向预搜索:"(?,"(?这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。

与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。

举例5:表达式 "(?\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。

由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。

很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空间,以及本站推荐的最简单易用的 DEELX 正则引擎。

3. 其他通用规则 还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。

3.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数)3.2 在表达式 "\s","\d","\w","\b" 表示特殊意义的同时,对应的大写字母表示相反的意义3.4 括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式 举例1:表达式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 时,结果是 "bbccdd"。

括号 "(?:)" 范围的匹配结果不进行记录,因此 "(\w)" 使用 "\1" 来引用。

3.5 常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global 默认情况下,表达式中的字母是要区分大小写的。

配置为 Ignorecase 可使匹配时不区分大小写。

有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。

默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。

配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。

配置为 Multiline 可以使 "^" 匹配①外,还可以匹配换行符之后,下一行开始前③的位置,使 "$" 匹配④外,还可以匹配换行符之前,一行结束②的位置。

4. 其他提示4.1 如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见本站 DEELX 正则引擎的说明文档。

4.2 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整个字符串只有数字。

4.3 如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 "\b",比如:使用 "\b(if|while|else|void|int )\b" 来匹配程序中的关键字。

4.4 表达式不要匹配空字符串。

否则会一直得到匹配成功,而结果什么都没有匹配到。

比如:准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:"\d*\.?\d*",因为如果什么都没有,这个表达式也可以匹配成功。

更好的写法是:"\d+\.?\d*|\.\d+"。

4.5 能匹配空字符串的子匹配不要循环无限次。

如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。

虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。

如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。

4.6 合理选择贪婪模式与非贪婪模式,参见话题讨论。

4.7 或 "|" 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 "|" 两边的表达式因为交换位置而有所不同。

正则表达式话题[原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regtopic.htm]本文将逐步讨论一些正则表达式的使用话题。

本文为本站基础篇之后的扩展,在阅读本文之前,建议先阅读正则表达式参考文档一文。

1. 表达式的递归匹配有时候,我们需要用正则表达式来分析一个计算式中的括号配对情况。

比如,使用表达式 "\( [^)]* \)" 或者 "\( .*? \)" 可以匹配一对小括号。

但是如果括号内还嵌有一层括号的话,如 "( ( ) )",则这种写法将不能够匹配正确,得到的结果是 "( ( )" 。

类似情况的还有 HTML 中支持嵌套的标签如 " " 等。

本节将要讨论的是,想办法把有嵌套的的成对括号或者成对标签匹配出来。

匹配未知层次的嵌套:有的正则表达式引擎,专门针对这种嵌套提供了支持。

并且在栈空间允许的情况下,能够支持任意未知层次的嵌套:比如 Perl,PHP,GRETA 等。

在 PHP 和 GRETA 中,表达式中使用 "(?R)" 来表示嵌套部分。

匹配嵌套了未知层次的 "小括号对" 的表达式写法如下:"\( ([^()] | (?R))* \)"。

[Perl 和 PHP 的示例代码]匹配有限层次的嵌套:对于不支持嵌套的正则表达式引擎,只能通过一定的办法来匹配有限层次的嵌套。

思路如下:第一步,写一个不能支持嵌套的表达式:"\( [^()]* \)","((?!).)*"。

这两个表达式在匹配有嵌套的文本时,只匹配最内层。

第二步,写一个可匹配嵌套一层的表达式:"\( ([^()] | \( [^()]* \))* \)"。

这个表达式在匹配嵌套层数大于一时,只能匹配最里面的两层,同时,这个表达式也能匹配没有嵌套的文本或者嵌套的最里层。

匹配嵌套一层的 "" 标签,表达式为:"((?!).|(((?!).)*))*"。

这个表达式在匹配 "" 嵌套层数大于一的文本时,只匹配最里面的两层。

第三步,找到匹配嵌套(n)层的表达式与嵌套(n-1)层的表达式之间的关系。

比如,能够匹配嵌套(n)层的表达式为: [标记头] ([匹配 [标记头] 和 [标记尾] 之外的表达式] | [匹配 n-1 层的表达式] )* [标记尾] 回头来看前面编写的 可匹配嵌套一层 的表达式: 第四步,依此类推,可以编写出匹配有限(n)层的表达式。

这种方式写出来的表达式,虽然看上去很长,但是这种表达式经过编译后,匹配效率仍然是很高的。

2. 非贪婪匹配的效率 可能有不少的人和我一样,有过这样的经历:当我们要匹配类似 "内容" 或者 "[b]加粗[/b]" 这样的文本时,我们根据正向预搜索功能写出这样的表达式:"([^))*" 或者 "((?!).)*"。

当发现非贪婪匹配之时,恍然大悟,同样功能的表达式可以写得如此简单:".*?"。

顿时间如获至宝,凡是按边界匹配的地方,尽量使用简捷的非贪婪匹配 ".*?"。

特别是对于复杂的表达式来说,采用非贪婪匹配 ".*?" 写出来的表达式的确是简练了许多。

然而,当一个表达式中,有多个非贪婪匹配时,或者多个未知匹配次数的表达式时,这个表达式将可能存在效率上的陷阱。

有时候,匹配速度慢得莫名奇妙,甚至开始怀疑正则表达式是否实用。

效率陷阱的产生: 在本站基础文章里,对非贪婪匹配的描述中说到: 如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。

具体的匹配过程是这样的:1. "非贪婪部分" 先匹配最少次数,然后尝试匹配 "右侧的表达式"。

2. 如果右侧的表达式匹配成功,则整个表达式匹配结束。

如果右侧表达式匹配失败,则 "非贪婪部分" 将增加匹配一次,然后再尝试匹配 "右侧的表达式"。

3. 如果右侧的表达式又匹配失败,则 "非贪婪部分" 将再增加匹配一次。

再尝试匹配 "右侧的表达式"。

4. 依此类推,最后得到的结果是 "非贪婪部分" 以尽可能少的匹配次数,使整个表达式匹配成功。

或者最终仍然匹配失败。

当一个表达式中有多个非贪婪匹配,以表达式 "d(\w+?)d(\w+?)z" 为例,对于第一个括号中的 "\w+?" 来说,右边的 "d(\w+?)z" 属于它的 "右侧的表达式",对于第二个括号中的 "\w+?" 来说,右边的 "z" 属于它的 "右侧的表达式"。

当 "z" 匹配失败时,第二个 "\w+?" 会 "增加匹配一次",再尝试匹配 "z"。

如果第二个 "\w+?" 无论怎样 "增加匹配次数",直至整篇文本结束,"z" 都不能匹配,那么表示 "d(\w+?)z" 匹配失败,也就是说第一个 "\w+?" 的 "右侧" 匹配失败。

此时,第一个 "\w+?" 会增加匹配一次,然后再进行 "d(\w+?)z" 的匹配。

循环前面所讲的过程,直至第一个 "\w+?" 无论怎么 "增加匹配次数",后边的 "d(\w+?)z" 都不能匹配时,整个表达式才宣告匹配失败。

其实,为了使整个表达式匹配成功,贪婪匹配也会适当的 让出 已经匹配的字符。

因此贪婪匹配也有类似的情况。

当一个表达式中有较多的未知匹配次数的表达式时,为了让整个表达式匹配成功,各个贪婪或非贪婪的表达式都要进行尝试减少或增加匹配次数,由此容易形成一个大循环的尝试,造成了很长的匹配时间。

本文之所以称之为 陷阱 ,因为这种效率问题往往不易察觉。

举例:"d(\w+?)d(\w+?)d(\w+?)z" 匹配 "ddddddddddd..." 时,将花费较长一段时间才能判断出匹配失败。

效率陷阱的避免: 避免效率陷阱的原则是:避免 多重循环 的 尝试匹配 。

并不是说非贪婪匹配就是不好的,只是在运用非贪婪匹配的时候,需要注意避免过多 循环尝试 的问题。

情况一:对于只有一个非贪婪或者贪婪匹配的表达式来说,不存在效率陷阱。

也就是说,要匹配类似 " 内容 " 这样的文本,表达式 "([^))*" 和 "((?!).)*" 和 ".*?" 的效率是完全相同的。

情况二:如果一个表达式中有多个未知匹配次数的表达式,应防止进行不必要的尝试匹配。

比如,对表达式 " script language=‘(.*?)‘>(.*?) /script " 来说,如果前面部分表达式在遇到 " script language=‘vbscript‘>" 时匹配成功后,而后边的 "(.*?) /script " 却匹配失败,将导致第一个 ".*?" 增加匹配次数再尝试。

而对于表达式真正目的,让第一个 ".*?" 增加匹配成 vbscript‘> 是不对的,因此这种尝试是不必要的尝试。

因此,对依靠边界来识别的表达式,不要让未知匹配次数的部分跨过它的边界。

前面的表达式中,第一个 ".*?" 应该改写成 "[^‘]*"。

后边那个 ".*?" 的右边再没有未知匹配次数的表达式,因此这个非贪婪匹配没有效率陷阱。

于是,这个匹配脚本块的表达式,应该写成:" script language=‘([^‘]*)‘>(.*?) /script " 更好。

揭开,正则,表达式,的,神秘,面纱,引言,正则,

加入收藏
               

亚马逊食人族?揭开食人族的恐怖面纱?不再吃人

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录