精品技术论坛

精品技术论坛 (https://bbs.et8.net/bbs/index.php)
-   『软件使用』 (https://bbs.et8.net/bbs/forumdisplay.php?f=17)
-   -   【求助】正则表达式学习求助(已解答谢谢各位老师) (https://bbs.et8.net/bbs/showthread.php?t=1043892)

river01 2013-09-29 12:11:09

【求助】正则表达式学习求助(已解答谢谢各位老师)
 
正则还没入门,想从实际问题出发来理解,请有空的帮助解答,如不特别指明编辑软件为EM。
1.在支持正则的编辑软件里,如何把“第29章”内的所有全角数字替换为半角数字,数字位数不定。
2楼答案:\H转换半角,仅有EM有这种扩展转义,写法类似于\H(字符),也就是
第([0123456789]+)章 TO 第\H\1章

2.如何把“上下五千年1”变为“上下五千年第1章” 数字是变化的
6楼答案:上下五千年(\d+) TO 上下五千年第\1章

3 .如何把 两个空行 变为 一个空行?\n与\r有什么区别?
6楼7楼答案:\n\n\n TO \n\n

4、如果要把特征首和尾之间的任何内容删除,内容可能跨行,怎么处理
答案:首.*尾 非贪婪模式 [\s\S]+?
EM默认不允许.跨行,在专业版有个自定义选项可以设置,同时要指定最大跨行

5.如何将匹配的第一处位置标记为1,第n处标记为n。如所有找到的"青年组"按匹配顺序替换为"青年1组""青年2组"。
这个看来超出了正则的范围,应该是正则匹配以后编辑器的事


6、如何将含有 第xx章 的行同时全部选中,或者提取复制到粘贴板。

23楼答案参照此贴 https://bbs.et8.net/bbs/showthread.php?t=864152
(?<=^|(第.+[章集])).*?(?=$|(第.+[章集]))

7、既然\s\S都不包括换行符那为什么[\s\S]*能跨行处理?
我是被网上有些教程误导了,实际上\S包括换行符。[\s\S]*?可以跨行处理

8、对于.*我还是有疑问,它会不会把后面的第字也匹配了?规则是什么,匹配到第字就终止.的匹配吗?
 单纯搜索.*会匹配至换行符前,“.*第”会终止于后面的第,不会把第作为.*的一部分,除非贪婪模式下有多个第。
EM有个开关可以设置.包括不包括换行符
9、正则表达式:(?<=^|(第.+[章集])).*?(?=$|(第.+[章集]))
这个我在EM里运行出错,但语法能理解。如果想在[章集]后面加上"空格4个汉字"的章节名字,如何表示4个汉字?
如果仅仅需要中文可以用[一-龥]包括简繁体

MacOS 2013-09-29 14:31:36

\H转换半角,仅有EM有这种扩展转义,写法类似于\H(字符),也就是
第([0123456789]+)章
TO
第\H\1章

judite 2013-09-29 15:43:30

正则不是用来做这种事滴
还是写程序解决罢
全角有编码问题,gb、utf-8、utf-16……你没法控制

shengweiice 2013-09-29 18:01:45

不太容易啊,没有必要用正则表达式,转化成16进制的,看看是多少,全部对应替换成数字就得了

river01 2013-09-30 08:10:59

2.如何把“上下五千年1”变为“上下五千年第1章” 数字是变化的

3 .如何把 两个空行 变为 一个空行?\n与\r有什么区别?

MacOS 2013-09-30 08:48:05

上下五千年(\d+)
TO
上下五千年第\1章
\n\n
TO
\n
\n是UNIX用的换行符,\r是MACINTOSH的,WINDOWS是两种连用,不少WINDOWS编辑器的正则中忽略\r

tomscat 2013-09-30 09:05:00

两空行变一空行,应该是把3个连续的回车换行替换2个

MacOS 2013-09-30 09:23:29

引用:

作者: tomscat (文章 11128786)
两空行变一空行,应该是把3个连续的回车换行替换2个

对,是俺的错了

river01 2013-09-30 12:25:27

谢谢热心解答,可我在to第\1章后不起作用,是文本编辑器差异吗.
我用MadEdit不起作用,用txtFormat后多了一个换行,只有em可以达到效果。

MacOS 2013-09-30 13:09:01

如果没特意说,一般是EM的规则,双字节处理只有EM

river01 2013-09-30 23:09:57

4、如果要把特征首和尾之间的任何内容删除,内容可能跨行,怎么处理
如:首
工要困——。,
时是要跺……,

MacOS 2013-10-01 00:41:15

首.*尾
EM默认不允许.跨行,在专业版有个自定义选项可以设置,同时要指定最大跨行

river01 2013-10-01 15:08:11

5.如何将匹配的第一处位置标记为1,第n处标记为n。如所有找到的"青年组"按匹配顺序替换为"青年1组""青年2组"。这个比较有用

river01 2013-10-01 15:14:49

6、如何将含有 第xx章 的行同时全部选中,或者提取复制到粘贴板。

nicol 2013-10-01 18:39:11

引用:

作者: river01 (文章 11129027)
4、如果要把特征首和尾之间的任何内容删除,内容可能跨行,怎么处理
如:首
工要困——。,
时是要跺……,

(首)[\s\S]+?(尾)
然后替换成\1\2,中间的就删掉了

引用:

作者: river01 (文章 11129128)
5.如何将匹配的第一处位置标记为1,第n处标记为n。如所有找到的"青年组"按匹配顺序替换为"青年1组""青年2组"。这个比较有用

这个要看各个编辑器的功能了,正则只能匹配,替换要看编辑器
你这个要求就是把青年组分成(青年)(组),替换的时候\1\2就行,中间插入计数器,我不知道那个编辑器支持这种



引用:

作者: river01 (文章 11129129)
6、如何将含有 第xx章 的行同时全部选中,或者提取复制到粘贴板。

第\d+章[^\n]+
这样就行了吧
如果是汉字数字的话就这样:
第[一二三四五六七八九十]+章[^\n]+


都是用regexbuddy测试的,不知道其他软件行不行

yugliu 2013-10-01 18:46:44

6、如何将含有 第xx章 的行同时全部选中,或者提取复制到粘贴板。

grep -E "第[0-9]+章" novel.txt

做这些处理,还是用 Linux 系统好。实在不行就来个 cygwin 。

MacOS 2013-10-01 18:48:59

都不能,有步骤操作都不是正则能做的,先看看WIKI的语法描述吧,大概来说,这是一种只限本次有效的正顺序匹配方式,5必须用其他算法轮询编号,6可以用AWK之类的输出程序将获取结果输出到文件或回显

yugliu 2013-10-01 18:49:21

引用:

作者: nicol (文章 11129172)
(首)[\s\S]+?(尾)然后替换成\1\2,中间的就删掉了这个要看各个编辑器的功能了,正则只能匹配,替换要看编辑器你这个要求就是把青年组分成(青年)(组),替换的时候\1\2就行,中间插入计数器,我不知道那个编辑器支持这种第\d+章[^\n]+这样就行了吧如果是汉字数字的话就这样: 第[一二三四五六七八九十]+章[......


要求是 "同时全部选中"
如果只是正则,如何同时选出所有匹配项,并复制出来...

nicol 2013-10-01 18:57:18

引用:

作者: yugliu (文章 11129177)
要求是 "同时全部选中"
如果只是正则,如何同时选出所有匹配项,并复制出来...

所以我说正则的工作是匹配啊,同时、全部、复制什么的就看各个编辑器了,呵呵


如果不嫌麻烦用regexbuddy楼主的要求4和6是可以实现的,5应该是没有编辑器支持插入计数器

yugliu 2013-10-01 18:59:38

5.如何将匹配的第一处位置标记为1,第n处标记为n。如所有找到的"青年组"按匹配顺序替换为"青年1组""青年2组"。这个比较有用

这个只能用程序实现,关键是替换结果中有一个是变值,一般软件不支持。或者用编辑器里的宏试试。

river01 2013-10-01 22:13:53

5•我在想当替换后会统计出共替换xx处,是不是每替换一次都有计数器?
6•换个思路用4的方法把不含第XX章的行全删除行不?

nicol 2013-10-01 23:54:28

引用:

作者: river01 (文章 11129217)
5•我在想当替换后会统计出共替换xx处,是不是每替换一次都有计数器?
6•换个思路用4的方法把不含第XX章的行全删除行不?

5. 这个要看软件,目前应该没有编辑器支持替换的时候插入变量的,最接近你的列子的是TC的批量重命名功能,可以实现用正则匹配文件名,替换的时候插入计数器,但是文本文件没见过有支持的编辑器

6. 4需要跨行的,而且为了避免匹配出错需要用非贪婪模式,你这第XX章不用这么麻烦的,格式固定了不用正则都能匹配到,从效率上来说不划算

venchia 2013-10-02 00:18:22

第六个问题我之前也遇到过,后来是用下面的方法解决的
https://bbs.et8.net/bbs/showthread.php?t=864152

em的话最好用的方法还是用宏,不过如果要方便快捷的话,还需要借助其他工具,比如findstr

river01 2013-10-02 10:24:27

引用:

作者: venchia (文章 11129251)
第六个问题我之前也遇到过,后来是用下面的方法解决的
https://bbs.et8.net/bbs/showthread.php?t=864152

em的话最好用的方法还是用宏,不过如果要方便快捷的话,还需要借助其他工具,比如findstr

对呢findstr正合适,但是findstr不支持正则查找,否则就完美了。

river01 2013-10-02 10:28:43

引用:

作者: MacOS (文章 11129176)
都不能,有步骤操作都不是正则能做的,先看看WIKI的语法描述吧,大概来说,这是一种只限本次有效的正顺序匹配方式,5必须用其他算法轮询编号,6可以用AWK之类的输出程序将获取结果输出到文件或回显

嗯,如果那么,不支持那么多步,这个理解了了

river01 2013-10-02 10:38:01

引用:

作者: nicol (文章 11129172)
(首)[\s\S]+?(尾)然后替换成\1\2,..

4•与12楼的.*除了保留首尾还有什么语法上的不同?

MacOS 2013-10-02 12:11:04

没有,同样是匹配所有字符,只是解释器的差异
6像16楼或19楼那样用输出是最常见做法,也不容易犯逻辑错误,如果转正则,需要把非匹配条件全逆反,将匹配区间趋向远离原规则,改写为正序逻辑,很容易漏掉一些区间,这条推理了一个基本没错误的写法
^[^第]*$|^.*第[^\d].*$|^.*第\d+[^章\d].*$
从第字的存在与否开始,逐渐逼近后面数字、数字后章字存在与否

nicol 2013-10-02 12:43:43

引用:

作者: river01 (文章 11129304)
4•与12楼的.*除了保留首尾还有什么语法上的不同?

[\s\S]+?是匹配任意字符的非贪婪模式,理论上最安全,实际上要看各个编辑器的具体情况

.* 是贪婪模式,也就是有可能会尽量多的匹配,基本上这种用法肯定会有错误匹配,这个如果写成.*?也是非贪婪模式,但是.这个用法不如[\s\S]适用性广

另外,不同编辑器对正则的解释都不同,所以,会出现在某个编辑器能用另一个就不行。如果要编辑的文本不是很大就用rexgexbuddy吧,这个可视化效果很不错。

foxme 2013-10-06 00:47:00

引用:

第\d+章[^\n]+
这样就行了吧
如果是汉字数字的话就这样:
第[一二三四五六七八九十]+章[^\n]+

@nicol 这个似乎只能匹配 第xx章 开头的行. 如果他前面有个空格或者字符什么的, 就不能匹配整行. 应该改为:

^.*第[^章]*?章.*$ //确定第和章之间是非"章"字的实例.

@river01 我对正则也很有兴趣, 我借你的帖子一起学习. 谢谢.

river01 2013-10-06 11:25:48

引用:

作者: foxme (文章 11130028)
nicol 这个似乎只能匹配 第xx章 开头的行. 如果他前面有个空格或者字符什么的, 就不能匹配整行. 应该改为:

^.*第.{1,n}章.*$ //其中n可以根据实际调整. 这样数字和中文数字就全匹配了(根据实际情况而定).

river01 我对正则也很有兴趣, 我借你的帖子一起学习. 谢谢.

我原意想提取有用的章节名所以前面的不用考虑,具体应用要根据实际情况。

8、对于.*我还是有疑问,它会不会把后面的第字也匹配了?规则是什么,匹配到第字就终止.的匹配吗?

foxme 2013-10-06 14:19:57

8、对于.*我还是有疑问,它会不会把后面的第字也匹配了?规则是什么,匹配到第字就终止.的匹配吗? //这个设计到惰性匹配和贪婪匹配.

样本: 第 九章 (第9章)

贪婪就是尽可能多的匹配, 一般正则默认的模式. 比如搜索: "第.*章", 这时会匹配: " 九章 (第9"

而惰性匹配就是尽可能少的匹配, 需要用?界定一下. 比如搜索: "第.*?章", 这时会匹配: " 九"

惰性匹配也有按照数量匹配的, 比如搜索: "第.{1,2}章", 这时会匹配" 九"

nicol 2013-10-06 15:40:23

引用:

作者: foxme (文章 11130028)
nicol 这个似乎只能匹配 第xx章 开头的行. 如果他前面有个空格或者字符什么的, 就不能匹配整行. 应该改为:

^.*第[^章]*?章.*$ //确定第和章之间是非"章"字的实例.

river01 我对正则也很有兴趣, 我借你的帖子一起学习. 谢谢.

是的,呵呵我没注意:blush;

nicol 2013-10-06 15:45:27

引用:

作者: river01 (文章 11130072)
我原意想提取有用的章节名所以前面的不用考虑,具体应用要根据实际情况。

8、对于.*我还是有疑问,它会不会把后面的第字也匹配了?规则是什么,匹配到第字就终止.的匹配吗?

建议你安装一个regexbuddy,里面有详细的解释,很直观的

贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配,要详细解释的话你得找个专门的教材看了,呵呵

river01 2013-10-06 16:42:06

引用:

作者: foxme (文章 11130098)
样本: 第 九章 (第9章)"第.*章", 这时会匹配: " 九章 (第9"而惰性匹配......

贪婪模式匹配"第"和最后那个"章"
非贪婪模式匹配"第"和最先那个"章"

MacOS 2013-10-06 18:10:15

7和8都是解释器的解释差异,中括号是内含字符的集合,\S包括了所有非空格字符,同样含有换行符在内,\s补上了空格,事实上已经是所有字符集,这种逻辑写法等价于其他有反义的字符转义符,像\w\W,\d\D,只要编辑器能解释\s\S,这两个同样表示所有字符集,.*是指^.*第[^章]*?章.*$吧,这段前后都有限定字符,匹配范围限定在一行以内,只要一行内有一段字符符合就行,如果是EM的专业版模式,则突破了换行的限制,会从光标起始一直到限定行数内寻找是否存在匹配项

foxme 2013-10-07 00:29:55

昨日我学习了一下emeditor的正则引擎, 他是基于最给力的perl的正则库的, 但是做了一些简化.

emeditor虽然基于perl, 但是恐怕有些删减, 相比而言有这么几个短板:
• 不支持 正则递归(recursion)下降算法 (?R) http://www.blueidea.com/tech/web/2009/7206_6.asp
• 不支持 大于9的索引获取(indexable captures)
• 不支持搜索追踪构建 embedded code, 这个一般debug用. http://my.safaribooksonline.com/book...ancements/i213
• 不支持最小组团 atomic groups http://www.regular-expressions.info/atomic.html
• 不支持命名捕获组 named capture http://www.regular-expressions.info/named.html

以此看来, emeditor的正则是很完善的. 值得好好学习.

MacOS 2013-10-07 03:57:23

引用:

作者: foxme (文章 11130210)
昨日我学习了一下emeditor的正则引擎, 他是基于最给力的perl的正则库的, 但是做了一些简化. emeditor虽然基于perl, 但是恐怕有些删减, 相比而言有这么几个短板:• 不支持 正则递归(recursion)下降算法 (?R) [url]http://www.blueidea.com/tech/web......

EM是双字节特化的编辑器,像[:punct:]之类的写法是特有的,为了降低双字节的编写难度,一些规则经常用起来会很奇怪

foxme 2013-10-07 05:46:21

引用:

作者: MacOS (文章 11130224)
EM是双字节特化的编辑器,像[:punct:]之类的写法是特有的,为了降低双字节的编写难度,一些规则经常用起来会很奇怪

实际上emeditor是支持[[:unicode:]]这样的写法的. 在他的帮助里面有说明. 有趣的是, 他的写法比你的举例还要复杂一些. 不过这些不经常使用, 也就unicode这个会用到而已.

emeditor是挺不错的. 还希望@river01多多提问, 我也顺道跟着长见识.

我个人目前对以下几个emeditor支持的正则很不熟悉, 不知道有没有高手能解释解释?

(?:pattern)
(?=pattern)
(?!pattern)
(?<=pattern)
(?<!pattern)

非常感谢.

river01 2013-10-07 12:35:53

(?:Expression),它表示所在位置可以匹配 Expression 我自己理解是不是可以与(Expression)?等效
(?=Expression) 顺序肯定环视,表示所在位置右侧能够匹配Expression
(?!Expression) 顺序否定环视,表示所在位置右侧不能匹配Expression
(?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expression
(?<!Expression) 逆序否定环视,表示所在位置左侧不能匹配Expression
后面的四个只表示判断条件,不占宽。

MacOS 2013-10-07 13:22:53

引用:

作者: foxme (文章 11130226)
实际上emeditor是支持[[:unicode:]]这样的写法的. 在他的帮助里面有说明. 有趣的是, 他的写法比你的举例还要复杂一些. 不过这些不经常使用, 也就unicode这个会用到而已.

emeditor是挺不错的. 还希望 river01多多提问, 我也顺道跟着长见识.

我个人目前对以下几个emed......

对,帮助都有写,这些定义都是其他编辑器所没有的,换其他正则写这些规则会很长,[:unicode:]倒比较少用,俺记得EM里还有不正规的替代写法
上楼有解释用法,注意的是后两个预查,EM中预查内容包含*等通配符的话是不能用的

river01 2013-10-07 13:48:26

引用:

作者: MacOS (文章 11130288)
EM中预查内容包含*等通配符的话是不能用的

这个提醒很好,免得以后走弯路。

river01 2013-10-07 14:16:44

(?<=^|(第.+[章集])).*?(?=$|(第.+[章集]))
1、这个我在EM里运行出错,但语法能理解。
2、如果想在[章集]后面加上固定的"空格加4个汉字"的章节名字,如何表示4个汉字?

nicol 2013-10-07 16:05:20

引用:

作者: river01 (文章 11130303)
(?<=^|(第.+[章集])).*?(?=$|(第.+[章集]))
1、这个我在EM里运行出错,但语法能理解。
2、如果想在[章集]后面加上固定的"空格加4个汉字"的章节名字,如何表示4个汉字?

汉字这个问题比较复杂,不知道别人是怎么解决的,我的解决方法是这样[\u2E80-\u9FFF]

按你的问题,4个汉字也就是[\u2E80-\u9FFF]{4}

这里的[\u2E80-\u9FFF]基本可以涵盖中日韩在内的简繁体双字节文字,如果仅仅需要中文可以用[\u4E00-\u9FFF]包括简繁体

river01 2013-10-07 17:09:17

引用:

作者: nicol (文章 11130334)
如果仅仅需要中文可以用[\u4E00-\u9FFF]包括简繁体

谢谢,那么中文双字节标点符号如,。、?!•:;¥是什么范围

MacOS 2013-10-07 17:51:39

引用:

作者: river01 (文章 11130303)
(?<=^|(第.+[章集])).*?(?=$|(第.+[章集]))
1、这个我在EM里运行出错,但语法能理解。
2、如果想在[章集]后面加上固定的"空格加4个汉字"的章节名字,如何表示4个汉字?

上面刚刚说完……预查里不能用通配,+是不行的
EM不能用UNICODE模式表示准确的范围,你可以试验一下[\u0000]——里面的UNICODE字符随便写,虽然这个表达式只应该匹配其中一个UNICODE字符,但在EM使用时是指代所有UNICODE字符,中文范围俺也忘了哪里到哪里了,回头查一下

nicol 2013-10-07 18:07:52

引用:

作者: river01 (文章 11130350)
谢谢,那么中文双字节标点符号如,。、?!•:;¥是什么范围

仅仅是标点符号?这个真没琢磨过,简单的可以直接用[。、?!•:;¥]这样的,把能想到的标点都加进去就行了,毕竟标点符号并不多。要范围的话得去unicode字符表查了,仅仅是中文标点的没研究过,呵呵

MacOS 2013-10-07 19:19:47

刚才试了SUBLIME TEXT,应该UNICODE的问题不是EM的,估计PERL引擎都会有,中括号UNICODE范围同样是所有UNICODE字符
中文符号有个偷懒的写法,就是利用这个UNICODE的范围错误,[^\x00-\xFF\u0000],只要不分大小写就是双字节符号集

river01 2013-10-07 21:00:40

引用:

作者: MacOS (文章 11130361)
上面刚刚说完……预查里不能用通配,+是不行的
EM不能用UNICODE模式表示准确的范围,你可以试验一下[\u0000]——里面的UNICODE字符随便写,虽然这个表达式只应该匹配其中一个UNICODE字符,但在EM使用时是指代所有UNICODE字符,中文范围俺也忘了哪里到哪里了,回头查一下

em预查不能通配,但我试了别的编辑器可以。

难道[\u0000]表示任意双字节unicode字符,那太强了。

MacOS 2013-10-07 21:28:54

应该说很多都不能用通配,估计是PERL系都是,起码UE和SUBLIME都不行,俺一直以为是EM特有的问题
并不是\u0000,而是任何UNICODE转义,EM和SUBLIME下都不能准确指定范围,只是看起来已经涵盖所有UNICODE字符,实际范围完全不明白,而且UNICODE写法实际上应该不能匹配UNICODE字符,而是双字节字符,比较明显的现象就是本地代码页不存在的字符是不匹配的,像十字架,心型,音符之类

foxme 2013-10-08 03:04:52

引用:

作者: river01 (文章 11130303)
(?<=^|(第.+[章集])).*?(?=$|(第.+[章集]))
1、这个我在EM里运行出错,但语法能理解。
2、如果想在[章集]后面加上固定的"空格加4个汉字"的章节名字,如何表示4个汉字?

在emeditor中可以用下面的方式粗略的定义4个所有非asc字符.

[[:unicode:]]{4}

如果是多语混排, 那么只能用下面的语句了

[^\x00-\xff]{4}

另外, @river01, 每次提问的时候要是能够提供一个样本文件, 这样我们讨论起来就方便一些.

judite 2013-10-08 09:11:31

想学正则先把标准弄弄清楚罢
除了一些unix工具如grep、sed、awk使用posix标准,比较新的工具都使用pcre。pcre已经是事实上的标准了

river01 2013-10-08 10:40:06

引用:

作者: MacOS (文章 11130414)
实际范围完全不明白,而且UNICODE写法实际上应该不能匹配UNICODE字符,而是......

实际测试了一下,确实不能匹配UNICODE字符.
[^\x00-\xff]是可以匹配的,包括汉字和中文标点。

MacOS 2013-10-08 10:53:05

[^\x00-\xff]在EM和SUBLIME中也不能匹配UNICODE,实际上也还是双字节,像版权符号没反应

river01 2013-10-08 14:39:34

引用:

作者: MacOS (文章 11130540)
[^\x00-\xff]在EM和SUBLIME中也不能匹配UNICODE,实际上也还是双字节,像版权符号没反应

EM不能用我就换别的,换来换去发现WORD处理起来更容易。[!^1-^127]

MacOS 2013-10-08 14:48:22

是,有时候其他非正则还是挺好用,特别是些特色替换

MacOS 2013-10-08 15:19:29

试出所谓UNICODE范围的真实意义了,实际上,[\u]是被解释为小写字符或者说非大写,然后后面跟着的数字被当作了列举,所以[\uXXXX]实际上是所有小写字符加XXX的数字,[\uABCD-\uEFGH]的实际释义是,所有小写字符,再含ABC,然后D开始一直到所有小写字符,再含EFGH,因为EM中在不分大小写时,把双字节字符当成非大写,所以看起来就像所有中文字符那样,实际上还是涵盖了部分数字或者字母的,还有个反写法\U也被证实是大写字符

MacOS 2013-10-08 15:36:35

再试了下发现还是不对,俺把^看漏了,\u实际是大小写都包含,这个的含义是非数字、非符号,其中非符号包括单字节双字节UNICODE全非,那实际上,[\uXXXX]就是外加XXXX的非符号单字了,[\uABCD-\uEFGH]也是取决于D,从该字符顺序以后的到第一个非符号都会匹配,外加ABCEFGH,作为他的反义,\U表示数字加所有符号

river01 2013-10-08 15:51:57

引用:

作者: MacOS (文章 11130621)
\U表示数字加所有符号...

我试的结果也是这样,^\U反而是汉字,当时就迷茫了。

MacOS 2013-10-08 15:59:26

仔细想了一下,俺的第一次分析应该是对的,只是漏掉了^忘记结论应该反过来,也就是说,56楼反过来说就是真实情况,也即是
引用:

实际上,[\u]是被解释为大写字符或者说非小写,然后后面跟着的数字被当作了列举,所以[\uXXXX]实际上是所有大写字符加XXXX的数字,[\uABCD-\uEFGH]的实际释义是,所有大写字符,再含ABC,然后D开始一直到所有小写字符,再含EFGH,因为EM中在不分大小写时,把双字节字符当成非小写,然后不分大小写的话还同时含小写字母,所以看起来就像所有中文字符那样,实际上还是涵盖了部分数字或者字母的,还有个反写法\U也被证实是小写字符


river01 2013-10-08 16:31:09

word可以用[!一-龥^a-^127]确切地匹配中文标点符号
我试着变成正则的语法[^1-龥\x00-\xff] 也能匹配部分中文标点,我再查查编码表,是不是漏了。

river01 2013-10-08 16:59:11

是我粗心,应该是"一-龥",没问题了。

MacOS 2013-10-08 17:00:26

漏了各种引号,你这个写法,不如[^\x00-\xff\u]简单

MacOS 2013-10-08 17:10:49

引用:

作者: river01 (文章 11130647)
是我粗心,应该是"一-龥",没问题了。

居然忽略了最简单的写法,如果EM的排序是UNICODE表,那这个应该是中文的全范围,GB表就难说
这样说来[^一-龥\x00-\xff]应该也不只是符号表,肯定会有日韩文字,而且再推想一下[^\x00-\xff\u]也不只是符号表,肯定还有全角英数

river01 2013-10-08 17:37:22

那就[!-~]吧,这样单纯了,以后需要什么符号范围就查表吧,只要能处理就好。

MacOS 2013-10-08 18:16:34

看了一下,如果照UNICODE表,还是老老实实列举吧,各种符号打得很散

foxme 2013-10-09 03:30:10

引用:

作者: judite (文章 11130504)
想学正则先把标准弄弄清楚罢
除了一些unix工具如grep、sed、awk使用posix标准,比较新的工具都使用pcre。pcre已经是事实上的标准了

我想楼主目前是在emeditor的框架下学习, 这个可能是本帖的讨论范围.

river01 2013-10-09 19:56:22

引用:

作者: MacOS (文章 11130667)
看了一下,如果照UNICODE表,还是老老实实列举吧,各种符号打得很散

硏究了下unicode表,基本搞清了。

lls 2013-10-10 11:08:02

EM自带全角/半角转换功能哦~~~


所有时间均为北京时间, 现在的时间是 00:33:39.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号