shqf 发表于 2014-6-27 22:11:17

本帖最后由 shqf 于 2014-6-28 07:30 编辑

个人理解,当用了“|”(或关系)时,且两边表达式都存在捕获组,会出现楼主的情况。即在结果输出时,整个表达式会存在一个或运算:
当两边都未匹配时(捕获值都为空),因两边要进行或运算,整个表达式结果为假,报未匹配到,没有输出。
当左边匹配到时,不再匹配右边表达式(左边第一个表达式优先),整个表达式结果为真,报匹配到,输出左边捕获到的内容。
当左边未匹到(捕获值为空),但右边表达式匹配时,两边或运算的结果为真,报匹配到,就输出左边捕获到的内容(空值)和右边捕获到的内容。
验证:把楼主的表达式左右换一下,(\d+\.\d+)元|(\d+)元,即右边匹配整数值时,就会发现匹配到的空值会很多,有7项,因为整数金额有7项。
    根据以上原理,解决楼主所遇到的问题时要么不用或关系,就像2楼A大的表达式,要么掌握“|”(或关系)两边不能同时存在捕获组的原则就行。如下:
一、源数据中都是金额数值时
1、(?:\d+)元|\d+\.\d+,右边不用上“元”,右边表达式中可不含捕获组,也能匹配出正确金额数值;
2、\d+\.\d+|\d+,两边都不含捕获组时,当然更能匹配出正确金额数值。
二、如源数据中含有非金额数值时
1、此时一定要用上“元”,且要匹配“元”时,可以把共同部分“元”放在或关系表达式的外面(共同的“元”只出现一次),整个或关系表达式作为一个组整体捕获,(\d+|\d+\.\d+)元,这样“|”两边的表达式中都不含捕获组了;
2、 用上“元”,但不匹配元,只匹配元前面的“位置”(因为“位置”宽度为0,术语称之为零宽,此类匹配位置的代码等称为零宽断言),此时无需捕获了,因为此时只匹配数值和元前面的位置, \d+(?=元)|\d+\.\d(?=元);
3、A大的这个表达式(\d+(?:\.\d+)?)元,思路巧,代码精。因为两种金额数值共同部分,都只用一次,即整数部分、单位“元”都只用一次,就没用到“|”关系。但其用了一次捕获,如果按其思路,不用捕获的话(也没有 “|”),只要匹配数值及“元”前面的“位置”就行,即:\d+(?:\.\d+)?(?=元)

cihren 发表于 2014-6-27 23:03:13

感觉应该是:分段的话,前面未匹配的段置空值。

看看下面这个图就会清楚许多。

李岸 发表于 2014-6-28 17:03:11

本帖最后由 李岸 于 2014-6-28 17:04 编辑

看来我的问题很能引起大家的共鸣呀,有afan版主这类的高手的帮助,在AU3这个领域上相信我们能越走越远
页: 1 [2]
查看完整版本: 请问这个正则匹配里面为什么有空格呢?