如何实现一个正则表达式搜索引擎份额 知乎 知乎

请推荐短小的编译器或正则引擎实现? - 知乎745被浏览30318分享邀请回答/seckcoder/pl_research/blob/master/racket/compiler/scheme/compilers-tutorial-tests-.tgz?raw=true1211 条评论分享收藏感谢收起/Dwarfartisan/ruskellswift的:231 条评论分享收藏感谢收起查看更多回答如何实现正则表达式引擎? - 知乎193被浏览6283分享邀请回答525 条评论分享收藏感谢收起正则的英语原文是regular,可以理解为有规律的,有规则的。&br&在英语里面被描述为regular的对象其实是比较简单的,容易掌握的对象。比如说正则语言只有几条简单的定义,除了原子(atom)的定义就是各种连接(concatenation)和求并(union),并且可以简单的用确定状态有限自动机表达;相对而言,上下文无关以及上下文相关语言就要复杂的多了,需要下推自动机和线性有限自动机来表示了。另一个例子是图论里的正则图(regular graph),也就是完全图,因为性质非常对称和规律,所以比较容易研究;其他各种不正则的图就没那么规律的性质了。&br&&br&P.S. 现在大部分情况提到的正则表达式都是各种编程语言里的正则表达式,这种“正则表达式”的表达能力往往超过了正则语言的范围。
正则的英语原文是regular,可以理解为有规律的,有规则的。 在英语里面被描述为regular的对象其实是比较简单的,容易掌握的对象。比如说正则语言只有几条简单的定义,除了原子(atom)的定义就是各种连接(concatenation)和求并(union),并且可以简单的…
&a href=&///?target=http%3A////xDaDDp6qe& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&//x&/span&&span class=&invisible&&DaDDp6qe&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
000|001|002|003 然后一直写到255。一般来说RegEx生成状态机的时候会折叠你的状态的233333.
000|001|002|003 然后一直写到255。一般来说RegEx生成状态机的时候会折叠你的状态的233333.
把文字全拷到word里面,然后全选&开始&Aa(更改大小写)&半角(W)
把文字全拷到word里面,然后全选&开始&Aa(更改大小写)&半角(W)
&p&这个正则表达式代表的是json的所有字面常量吧,分别有&/p&&ul&&li&可以使用UTF-16编码(譬如\uDEAD)的字符串&/li&&li&true, false, null&/li&&li&整数&/li&&li&小数&/li&&li&科学计数法&/li&&/ul&
这个正则表达式代表的是json的所有字面常量吧,分别有可以使用UTF-16编码(譬如\uDEAD)的字符串true, false, null整数小数科学计数法
&div class=&highlight&&&pre&&code class=&language-text&&&\&&(.*?)&/&
&/code&&/pre&&/div&
"\"&(.*?)&/"
bs4中正则的用途是过滤器,也就是说find或者findall中的参数部分会涉及到正则。&br&而题主所说的select是css选择器,基本上是独立于上面所说的过滤器方式,所以不会用到正则。&br&如果你需要提取标签的文字部分,请用.text/get_text()&br&如果需要提取tag的属性,直接用get()。&br&至于提取出来的属性和文字都是字符串,这时候你想用正则进行进一步处理就很随意了。&br&手机码字真难受!&br&---------------------------------------在电脑上补充一下-------------------------------------------------&br&首先, 我们需要知道我们的目标是什么:&br&&ol&&li&tag中的文字, 比如说超链接文本, 或者一些表格中的数据, 这属于&b&可以遍历的字符串&/b&&br&&/li&&li&tag中的属性, 比如图片链接, 或者时下一页的链接,或者其他需要的信息. 这属于&b&tag对象的属性&/b&.&/li&&/ol&&br&&blockquote&BeautifulSoup解析然后select提取到的内容是bs4.element.Tag,如何用正则??&br&&/blockquote&楼主, 当你提取到了tag对象,不是想当然的就把一个tag对象当做字符串处理,直接用正则提取,如果tag'对象是字符串,一开始直接用正则就好了,没必要用BeautifulSoup.&br&其实文档中写的很详细,我在这里只是指出楼主你认识上的一些错误, 文档链接在下&br&&img src=&/v2-1bd18e7ad_b.png& data-rawwidth=&775& data-rawheight=&647& class=&origin_image zh-lightbox-thumb& width=&775& data-original=&/v2-1bd18e7ad_r.png&&&a href=&///?target=http%3A//beautifulsoup.readthedocs.io/zh_CN/latest/%23tag& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Beautiful Soup 4.4.0 文档&i class=&icon-external&&&/i&&/a&&br&&br&----------------------------------------代码区------------------------------------------------------------&br&提取表格内容不推荐用正则表达式, 我们可以把表格中的内容先用Beautifulsoup提取出来,再筛选, 如果你用正则表达式, 比如说 r'\d+' 只能提取到一大堆数字, 并没有实际意义, 下面是代码&br&&div class=&highlight&&&pre&&code class=&language-python3&&&span class=&kn&&from&/span& &span class=&nn&&bs4&/span& &span class=&k&&import&/span& &span class=&n&&BeautifulSoup&/span&
&span class=&n&&html&/span& &span class=&o&&=&/span& &span class=&s&&'''&table class=&childTb&&&tr&&td class=&Ts&&时间&/td&&td&CODcr[Avg]&/td&&td&CODcr[Cou]&/td&&td&pH[Avg]&/td&&td&废水流量[Cou]&/td&&/tr&&tr&&td&单位&/td&&td&(mg/L)&/td&&td&(Kg)&/td&&td&(无量纲)&/td&&td&M3&/td&&/tr&&tr&&td&00:00:00&/td&&td&24.00&/td&&td&0.46&/td&&td&8.19&/td&&td&19.00&/td&&/tr&&tr&&td&01:00:00&/td&&td&24.00&/td&&td&0.43&/td&&td&8.20&/td&&td&18.00&/td&&/tr&&tr&&td&02:00:00&/td&&td&24.00&/td&&td&0.46&/td&&td&8.20&/td&&td&19.00&/td&&/tr&&tr&&td&03:00:00&/td&&td&24.00&/td&&td&0.46&/td&&td&8.20&/td&&td&19.00&/td&&/tr&&tr&&td&04:00:00&/td&&td&24.00&/td&&td&0.46&/td&&td&8.21&/td&&td&19.00&/td&&/tr&&tr&&td&05:00:00&/td&&td&24.00&/td&&td&0.46&/td&&td&8.22&/td&&td&19.00&/td&&/tr&&tr&&td&06:00:00&/td&&td&22.50&/td&&td&0.43&/td&&td&8.22&/td&&td&19.00&/td&&/tr&&tr&&td&07:00:00&/td&&td&22.00&/td&&td&0.42&/td&&td&8.23&/td&&td&19.00&/td&&/tr&&tr&&td&08:00:00&/td&&td&22.00&/td&&td&0.44&/td&&td&8.23&/td&&td&20.00&/td&&/tr&&tr&&td&09:00:00&/td&&td&22.00&/td&&td&0.42&/td&&td&8.22&/td&&td&19.00&/td&&/tr&...&/table&'''&/span&
&span class=&n&&soup&/span& &span class=&o&&=&/span& &span class=&n&&BeautifulSoup&/span&&span class=&p&&(&/span&&span class=&n&&html&/span&&span class=&p&&,&/span& &span class=&s&&'lxml'&/span&&span class=&p&&)&/span&
&span class=&n&&rows&/span& &span class=&o&&=&/span& &span class=&n&&soup&/span&&span class=&o&&.&/span&&span class=&n&&find_all&/span&&span class=&p&&(&/span&&span class=&s&&'tr'&/span&&span class=&p&&)&/span&
&span class=&k&&for&/span& &span class=&n&&row&/span& &span class=&ow&&in&/span& &span class=&n&&rows&/span&&span class=&p&&:&/span&
&span class=&n&&cell&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&o&&.&/span&&span class=&n&&text&/span& &span class=&k&&for&/span& &span class=&n&&i&/span& &span class=&ow&&in&/span& &span class=&n&&row&/span&&span class=&o&&.&/span&&span class=&n&&find_all&/span&&span class=&p&&(&/span&&span class=&s&&'td'&/span&&span class=&p&&)]&/span&
&span class=&nb&&print&/span&&span class=&p&&(&/span&&span class=&n&&cell&/span&&span class=&p&&)&/span&
&span class=&p&&[&/span&&span class=&s&&'时间'&/span&&span class=&p&&,&/span& &span class=&s&&'CODcr[Avg]'&/span&&span class=&p&&,&/span& &span class=&s&&'CODcr[Cou]'&/span&&span class=&p&&,&/span& &span class=&s&&'pH[Avg]'&/span&&span class=&p&&,&/span& &span class=&s&&'废水流量[Cou]'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'单位'&/span&&span class=&p&&,&/span& &span class=&s&&'(mg/L)'&/span&&span class=&p&&,&/span& &span class=&s&&'(Kg)'&/span&&span class=&p&&,&/span& &span class=&s&&'(无量纲)'&/span&&span class=&p&&,&/span& &span class=&s&&'M3'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'00:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'24.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.46'&/span&&span class=&p&&,&/span& &span class=&s&&'8.19'&/span&&span class=&p&&,&/span& &span class=&s&&'19.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'01:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'24.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.43'&/span&&span class=&p&&,&/span& &span class=&s&&'8.20'&/span&&span class=&p&&,&/span& &span class=&s&&'18.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'02:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'24.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.46'&/span&&span class=&p&&,&/span& &span class=&s&&'8.20'&/span&&span class=&p&&,&/span& &span class=&s&&'19.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'03:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'24.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.46'&/span&&span class=&p&&,&/span& &span class=&s&&'8.20'&/span&&span class=&p&&,&/span& &span class=&s&&'19.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'04:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'24.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.46'&/span&&span class=&p&&,&/span& &span class=&s&&'8.21'&/span&&span class=&p&&,&/span& &span class=&s&&'19.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'05:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'24.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.46'&/span&&span class=&p&&,&/span& &span class=&s&&'8.22'&/span&&span class=&p&&,&/span& &span class=&s&&'19.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'06:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'22.50'&/span&&span class=&p&&,&/span& &span class=&s&&'0.43'&/span&&span class=&p&&,&/span& &span class=&s&&'8.22'&/span&&span class=&p&&,&/span& &span class=&s&&'19.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'07:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'22.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.42'&/span&&span class=&p&&,&/span& &span class=&s&&'8.23'&/span&&span class=&p&&,&/span& &span class=&s&&'19.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'08:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'22.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.44'&/span&&span class=&p&&,&/span& &span class=&s&&'8.23'&/span&&span class=&p&&,&/span& &span class=&s&&'20.00'&/span&&span class=&p&&]&/span&
&span class=&p&&[&/span&&span class=&s&&'09:00:00'&/span&&span class=&p&&,&/span& &span class=&s&&'22.00'&/span&&span class=&p&&,&/span& &span class=&s&&'0.42'&/span&&span class=&p&&,&/span& &span class=&s&&'8.22'&/span&&span class=&p&&,&/span& &span class=&s&&'19.00'&/span&&span class=&p&&]&/span&
&/code&&/pre&&/div&
bs4中正则的用途是过滤器,也就是说find或者findall中的参数部分会涉及到正则。 而题主所说的select是css选择器,基本上是独立于上面所说的过滤器方式,所以不会用到正则。 如果你需要提取标签的文字部分,请用.text/get_text() 如果需要提取tag的属性,直…
C++11拯救你,换行符也保留了(你那种不行):&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&char&/span& &span class=&n&&test_asp&/span&&span class=&p&&[]&/span& &span class=&o&&=&/span& &span class=&n&&R&/span&&span class=&s&&&Fuck(&html&&/span&
&span class=&err&&“&/span&&span class=&n&&lun&/span& &span class=&n&&zi&/span& &span class=&n&&ge&/span&&span class=&err&&”&/span& &span class=&n&&is&/span& &span class=&n&&great&/span&
&span class=&o&&&/&/span&&span class=&n&&html&/span&&span class=&o&&&&/span&&span class=&p&&)&/span&&span class=&n&&Fuck&/span&&span class=&s&&&;&/span&
&/code&&/pre&&/div&&br&算法如下:检查字符串里面有没有)Fuck&,没有就直接上,有的话就尝试一下)FuckFuck&并做出相应的改变。因为字符串总是有限长度的,你总能找到一个 &div class=&highlight&&&pre&&code class=&language-text&&\)(Fuck)+”
&/code&&/pre&&/div& 是字符串里不包含的,done。
C++11拯救你,换行符也保留了(你那种不行): char test_asp[] = R"Fuck(&html&
“lun zi ge” is great
&/html&)Fuck"; 算法如下:检查字符串里面有没有)Fuck",没有就直接上,有的话就尝试一下)FuckFuck"并做出相应的改变。因为字符串总是有限长度的,你…
Regular expression&br&&br&简称 RegEx&br&&br&中文翻译为正则表达式&br&&br&正则有正其礼仪法则;正规;常规等意思。&br&&br&这里的正不是正反的正,所以没有负则表达式&br&&br&o(●?ω`●)o&br&&br&&br&标题的钓鱼什么鬼啊!
Regular expression 简称 RegEx 中文翻译为正则表达式 正则有正其礼仪法则;正规;常规等意思。 这里的正不是正反的正,所以没有负则表达式 o(●?ω`●)o 标题的钓鱼什么鬼啊!
帮忙解释下, 在 ES6 之前, 有的 Unicode 字符无法用一个单一的 \u 转义, 需要拆分成一个代理对. 也就是 `[\ud800-\udbff][\udc00-\udfff]`. 比如 `'\ud842\udfb7'.length` (直接打汉字被知乎吃了, 只能拆成转义), 虽然只有一个汉字, 但字符串长度为 2.&br&&br&正则在匹配的时候, 如果当前位置可以匹配到满足的字符串, 则不会尝试下一个分支, 即使下一个分支也能匹配并且字符串更短.
帮忙解释下, 在 ES6 之前, 有的 Unicode 字符无法用一个单一的 \u 转义, 需要拆分成一个代理对. 也就是 `[\ud800-\udbff][\udc00-\udfff]`. 比如 `'\ud842\udfb7'.length` (直接打汉字被知乎吃了, 只能拆成转义), 虽然只有一个汉字, 但字符串长度为 2. 正则…
正则表达式是精确匹配文本的,而通用搜索引擎是用来根据自然语义搜索信息的。
正则表达式是精确匹配文本的,而通用搜索引擎是用来根据自然语义搜索信息的。
S ::= a S b S&br&S ::= b S a S&br&但是没办法变成正则文法
S ::= a S b S S ::= b S a S 但是没办法变成正则文法
&p&打开控制台,输入如下代码,然后看看你的CPU,你的电脑不卡算我输:&/p&&p&'10000'.match(/([01]+)+b/)&/p&&p&这长度还不到100呢&/p&&br&&p&有人问这个正则为什么会让进程卡死,当然是因为进入了类似死循环的情况了&/p&&p&大致解释一下,可以看到里面有两个加号,而且都是贪婪匹配,这会导致内层的加号首先尝试把整个正则表达式匹配完,然后外层的加号再把这个模式重复,然而重复的时候又会发生一次内层加号的匹配,而两个加号匹配完成后又发现后面并没有一个b,于是回溯到外层括号(因为外层是后匹配的,所以先回溯到它)减少其匹配数量,每次回溯都会有很多条分支可走(加号可以选择匹配1到无穷多个,此例中即为匹配到字符串的结束),最后直到回溯到最开始的两个字符,上例中即10,然后发现第三个符号依然不是b,然后才告结束。&/p&&p&每一次面临选择,都有从该位置直到结束那么多种选择,时间复杂度大概是n的阶乘&/p&&p&评论有人提到在不同的语言下性能不一样,原因是不同的语言内置的正则引擎不一样,我了解的也不多,就不细说了。&/p&
打开控制台,输入如下代码,然后看看你的CPU,你的电脑不卡算我输:'10000'.match(/([01]+)+b/)这长度还不到100呢 有人问这个正则为什么会让进程卡死,当然是因为进入了类似死循环的情况了大致解释一下,…
不谢邀。这样的问题邀请我来干嘛?&br&&br&简单的把JavaScript的split和正则的文档通读一遍就能解决的问题,不值得回答。&br&&br&&br&还有, &a data-hash=&f96abbd90ada5ee167130& href=&///people/f96abbd90ada5ee167130& class=&member_mention& data-editable=&true& data-title=&@Sanmao Zhao& data-hovercard=&p$b$f96abbd90ada5ee167130&&@Sanmao Zhao&/a& 我早被轮子拉黑了,不用叫我评论。不过谢谢你,又让我更新了认识:轮子这次连问题都没看清就开始胡说八道了。
不谢邀。这样的问题邀请我来干嘛? 简单的把JavaScript的split和正则的文档通读一遍就能解决的问题,不值得回答。 还有,
我早被轮子拉黑了,不用叫我评论。不过谢谢你,又让我更新了认识:轮子这次连问题都没看清就开始胡说八道了。
方法一:&br&:set tw=100 fo+=Mm&br&gggqG&br&:w&br&&br&方法二:&br&:%s/.\{100}/&\r/g
方法一: :set tw=100 fo+=Mm gggqG :w 方法二: :%s/.\{100}/&\r/g
&a href=&///?target=http%3A//deerchao.net/tutorials/regex/regex.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&正则表达式30分钟入门教程&i class=&icon-external&&&/i&&/a&
PS:天猫前端招聘
求用简历蹂躏&br&&br&&br&&br&&br&谢 &a data-hash=&fb4e10ae7aeb128b38603e02& href=&///people/fb4e10ae7aeb128b38603e02& class=&member_mention& data-tip=&p$b$fb4e10ae7aeb128b38603e02& data-hovercard=&p$b$fb4e10ae7aeb128b38603e02&&@田彬&/a&妖~&br&查了好久才来答#尴尬笑~#&br&\B是是正则表达式里面一个比较特殊的匹配代码,表示单词的分界处.&br&&img src=&/d470b0d84d91f39fac7976acea9e45dc_b.jpg& data-rawwidth=&381& data-rawheight=&131& class=&content_image& width=&381&&至于?:表示是否取消反向代理,有?:是代表取消反向代理,反之不取消,具体示范如下&br&&img src=&/51e111c99f8d93fae8e37b_b.jpg& data-rawwidth=&386& data-rawheight=&264& class=&content_image& width=&386&&至于?=和 &a data-hash=&5d5b45cd774cbc1af7f437& href=&///people/5d5b45cd774cbc1af7f437& class=&member_mention& data-editable=&true& data-title=&@Lay Sent& data-tip=&p$b$5d5b45cd774cbc1af7f437& data-hovercard=&p$b$5d5b45cd774cbc1af7f437&&@Lay Sent&/a& 所说的一样表示匹配一个符合后面正则要求的位置而已&br&&img src=&/f73fcd7f9de943_b.jpg& data-rawwidth=&352& data-rawheight=&140& class=&content_image& width=&352&&所以 str.replace( /\B(?=(?:\d{3})+$)/g, ',' );的意思是:&br&在str中匹配任意一个字母的结束的地方,如果这个地方的前面是有三个数字(\d{3})则将该处匹配的空白替换为&,&(就是\B的匹配结果替换为逗号),所以就实现了千分制,如果我没看错的话,题主的正则作用就是实现将数字千分制吧。&br&&img src=&/e531d1717961eaef293b55cfb943f157_b.jpg& data-rawwidth=&317& data-rawheight=&145& class=&content_image& width=&317&&所以,并不是没有用到$1,只是将匹配到的空白符替换成了逗号而已。&br&&br&额 答主学术
PS:天猫前端招聘 求用简历蹂躏 谢 妖~ 查了好久才来答#尴尬笑~# \B是是正则表达式里面一个比较特殊的匹配代码,表示单词的分界处. 至于?:表示是否取消反向代理,有?:是代表取消反向代理,反之不取消,具体示范如下 至于?=和
所说的一样表示…
&p&&a href=&///?target=http%3A///vczh/archive//50763.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《构造正则表达式引擎》新鲜出炉啦!&i class=&icon-external&&&/i&&/a&&/p&&br&&p&我的文章的第二篇说了,分组是没办法做成DFA的,因为要把很多额外的信息加入NFA里面。要仔细阅读。&/p&
我的文章的第二篇说了,分组是没办法做成DFA的,因为要把很多额外的信息加入NFA里面。要仔细阅读。
给你提供一个用 vim 的解决方案,两分钟完事。&br&&br&视频演示:&a href=&///?target=http%3A///s/1hqzmFly%230-qzone-1-1d2a4e8d1a374a433f596ad1440& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vim批量修改行前缀 .mp4&i class=&icon-external&&&/i&&/a&&br&&br&用到了 vim 的其中一个核心功能:寄存器。&br&&br&一、先分组,为后续操作做准备。这里大致写一下,不能全部匹配的自己改改。&br&&div class=&highlight&&&pre&&code class=&language-vim&&%s&span class=&sr&&/\(^.*\).part\d\_.\{-}\n\1\@!/&/span&&\&span class=&k&&r&/span&/&span class=&k&&g&/span&
&/code&&/pre&&/div&&br&二、定义一个寄存器为起始数&br&&div class=&highlight&&&pre&&code class=&language-vim&&&span class=&p&&:&/span&&span class=&k&&let&/span& @&span class=&k&&a&/span&&span class=&p&&=&/span&&span class=&m&&193&/span&
&/code&&/pre&&/div&&br&三、记录一个宏,然后这样操作:&br&&div class=&highlight&&&pre&&code class=&language-vim&&qq
记录一个宏到寄存器 @&span class=&k&&q&/span& &span class=&p&&,&/span&这里随意,不要用 @&span class=&k&&a&/span& 就可以了。
&span class=&p&&&&/span&C&span class=&p&&-&/span&&span class=&k&&v&/span&&span class=&p&&&&/span&
进入块操作模式
&span class=&p&&&&/span&S&span class=&p&&-&/span&]&span class=&p&&&&/span& &span class=&k&&k&/span&
选中一个组
&span class=&p&&&&/span&S&span class=&p&&-&/span&&span class=&k&&i&/span&&span class=&p&&&&/span&
进入插入模式
&span class=&p&&&&/span&C&span class=&p&&-&/span&&span class=&k&&r&/span&&span class=&p&&&&/span& &span class=&k&&a&/span& _
插入寄存器 @&span class=&k&&a&/span& 的内容,也就是 &span class=&m&&193&/span&,还有一个空格,这里用「 _ 」表示
&span class=&p&&&&/span&esc&span class=&p&&&&/span&
退出插入模式
&span class=&p&&:&/span&&span class=&k&&let&/span& @&span class=&k&&a&/span&&span class=&p&&=&/span&@&span class=&k&&a&/span&&span class=&p&&+&/span&&span class=&m&&1&/span& 给寄存器中的数字加 &span class=&m&&1&/span&
&span class=&p&&&&/span&S&span class=&p&&-&/span&]&span class=&p&&&&/span& &span class=&k&&j&/span&
定位到下一组
&span class=&k&&q&/span&
&/code&&/pre&&/div&&br&四、把你的宏运行 N 次,完成。N 的数量你在第第一步分组的时候应该已经知道。&br&&br&五、删除掉空行&br&&div class=&highlight&&&pre&&code class=&language-vim&&&span class=&p&&:&/span&%s&span class=&sr&&/^$\n/&/span&/
&/code&&/pre&&/div&
给你提供一个用 vim 的解决方案,两分钟完事。 视频演示: 用到了 vim 的其中一个核心功能:寄存器。 一、先分组,为后续操作做准备。这里大致写一下,不能全部匹配的自己改改。 %s/\(^.*\).part\d\_.\{-}\n\1\@!/&\r/g
二、定义一…
//(?&fuck&[^/]+/[^/]+)/.+
//(?&fuck&[^/]+/[^/]+)/.+
已有帐号?
无法登录?
社交帐号登录如何从零写一个正则表达式引擎? - 知乎1821被浏览87517分享邀请回答/picasso250/0efceb93好吧,我将
的C++的版本改成了JS版本。偏特化用类实现,模板匹配用switch+instanceof 语句实现,字符串结尾判断用s[i] === undefined 实现因为不到40行,就把代码直接放上来吧// from c++ version: /timshen91/f6a3f040e5b5b0685b2a
// author: wangxiaochi
function ConcatExpr (Left,Right) {this.Left = Left;this.Right=Right} // ab
function AltExpr(Left,Right) {this.Left = Left;this.Right=Right} // a|b
function RepeatExpr(SubExpr) {this.SubExpr= SubExpr;} // a*
function OptionalExpr(SubExpr) {this.SubExpr= SubExpr;} // a?
function MatchExpr(ch) {
this.ch= ch
MatchImplApply = function (expr, target, i, cont) {
switch (true) {
case expr instanceof ConcatExpr:
return MatchImplApply(expr.Left, target, i, (rest,ri) =&
MatchImplApply(expr.Right, rest, ri, cont))
case expr instanceof AltExpr:
return (MatchImplApply(expr.Left, target, i, cont) ||
MatchImplApply(expr.Right, target, i, cont))
case expr instanceof RepeatExpr:
return MatchImplApply(expr.SubExpr, target, i, (rest,ri) =&
(MatchImplApply(expr, rest, ri, cont) || cont(rest,ri))
) || cont(target, i)
case expr instanceof OptionalExpr:
return MatchImplApply(expr.SubExpr, target, i, cont) || cont(target, i)
case expr instanceof MatchExpr:
return target[i] !== undefined && target[i] == expr.ch && cont(target, i+1) // end of string, match a char
throw "no expression type"
RegexMatch = (RegExpr,target) =& // all match
MatchImplApply(RegExpr, target,0, (rest,i) =& rest[i] === undefined)
RegexSearch = (RegExpr,target,i) =& // partial match from begining
MatchImplApply(RegExpr, target,i, (rest,i) =& true) ||
(target[i] !== undefined && RegexSearch(RegExpr, target, i+1))
console.assert(RegexMatch(new ConcatExpr(new MatchExpr('a'), new MatchExpr('b')), "ab"));
console.assert(RegexMatch(new AltExpr(new MatchExpr('a'), new MatchExpr('b')), "a"));
console.assert(RegexMatch(new AltExpr(new MatchExpr('a'), new MatchExpr('b')), "b"));
console.assert(RegexMatch(new RepeatExpr(new MatchExpr('a')), "aaaaa"));
console.assert(RegexMatch(new ConcatExpr(new RepeatExpr(new MatchExpr('a')), new MatchExpr('b')),
"aaaaab"));
console.assert(RegexMatch(new ConcatExpr(new RepeatExpr(new MatchExpr('a')), new MatchExpr('b')),
console.assert(RegexSearch(new ConcatExpr(new RepeatExpr(new MatchExpr('a')), new MatchExpr('b')),
"aaaaabb", 0));
console.assert(RegexMatch(new OptionalExpr(new MatchExpr('a')), "a"));
console.assert(RegexMatch(new OptionalExpr(new MatchExpr('a')), ""));
console.assert(RegexMatch(new OptionalExpr(new ConcatExpr(new MatchExpr('a'), new MatchExpr('b'))),
console.assert(RegexMatch(new OptionalExpr(new ConcatExpr(new MatchExpr('a'), new MatchExpr('b'))),
121 条评论分享收藏感谢收起

我要回帖

更多关于 起源引擎2知乎 的文章

 

随机推荐