5735988 发表于 2026-1-24 04:33:43

中文数字正则提取,请教。(已解决)

本帖最后由 5735988 于 2026-1-24 12:04 编辑

123 452 125 785 354 小明正一负二学分
123 452 125 785 354 小明正1负2学分
123 452 125 785 354 小李正三负二学分
123 452 125 785 354 小王正5负3学分

123 452 125 785 354 一正二负学分小明
学分123 452 125 785 354 三正二负小李
学分123 452 125 785 3545正3负学分小王   ;有可能会出现数字, 但是每行都有正负两个字   或者负正   

上面数字不固定,我想提取替换一下,
结果: 数字(正一   负二)学分小明,其他位置不变      中间放个空格就好,
结果: 数字(一正   二负)学分小王,其他位置不变      中间放个空格就好,
结果: 数字(5正   3负)学分小王,其他位置不变      中间放个空格就好,
结果: 数字(15正   23负)学分小王,其他位置不变      中间放个空格就好,
#include <Array.au3>

;~ $arrays = StringRegExp($str, '\D(\V?)正(\V)负', 2)
;~ If @extended Then
;~         _zhuan_Huan()
;~         $str = StringReplace($str, "正", " 正 ")
;~ EndIf


5735988 发表于 2026-1-24 04:36:08

(\V)正(\V)负
(\V)负(\V)正

这个正则都不对。。

gyp2000 发表于 2026-1-24 11:11:33

本帖最后由 gyp2000 于 2026-1-24 11:14 编辑


Local $sText = "需要处理的数据"

$sText = StringRegExpReplace($sText, '(正[一|二|三])(负[一|二|三])', ' \1\2')
$sText = StringRegExpReplace($sText, '([一|二|三]正)([一|二|三]负)', ' \1\2 ')
$sText   = StringRegExpReplace($sText , '(学分)', ' \1 ')
......
先用正则替换将关键字之间替换出空格。
然后将数据使用空格作为分隔符转换成二维数组。
最后检查数组中的每个元素,判断数据类型后格式化输出。

5735988 发表于 2026-1-24 12:03:49

gyp2000 发表于 2026-1-24 11:11
Local $sText = "需要处理的数据"

$sText = StringRegExpReplace($sText, '(正[一|二|三])(负[一|二|三]) ...

老哥,这个代码对我很重要。谢谢。

gyp2000 发表于 2026-1-24 12:37:36

5735988 发表于 2026-1-24 12:03
老哥,这个代码对我很重要。谢谢。

Local $sText = '123 452 125 785 354 小明正一负二学分' & @CRLF
$sText &= '123 452 125 785 354 小明正1负2学分' & @CRLF
$sText &= '123 452 125 785 354 小李正三负二学分' & @CRLF
$sText &= '123 452 125 785 354 小王正5负3学分' & @CRLF
$sText &= '123 452 125 785 354 一正二负学分小明' & @CRLF
$sText &= '学分123 452 125 785 354 三正二负小李' & @CRLF
$sText &= '学分123 452 125 785 3545正3负小王' & @CRLF
$sText = StringRegExpReplace($sText , '(学分)', '')
$sText = StringRegExpReplace($sText, '((\d{1,3}\s?){5})(.*)(正[一|二|三])(负[一|二|三])(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\s?){5})(.*)([一|二|三]正)([一|二|三]负)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\s?){5})(.*)(\d+正)(\d+负)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\s?){5})(.*)(正\d+)(负\d+)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
ConsoleWrite($sText)

gyp2000 发表于 2026-1-24 12:55:01

如果数字之间的空格数量有多有少 可以用 \h*

$sText = StringRegExpReplace($sText , '(学分)', '')
$sText = StringRegExpReplace($sText, '((\d{1,3}\h*){5})(.*)(正[一|二|三])(负[一|二|三])(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\h*){5})(.*)([一|二|三]正)([一|二|三]负)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\h*){5})(.*)(\d+正)(\d+负)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\h*){5})(.*)(正\d+)(负\d+)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')

5735988 发表于 2026-1-24 13:03:00

gyp2000 发表于 2026-1-24 12:55
如果数字之间的空格数量有多有少 可以用 \h*

$sText = StringRegExpReplace($sText , '(学分)', '')


数学 123234567345   023   146学分 5分
数学 123234567345   023   121   5学分 学分
语文 453234527365   023   181   6分 学分
语文 453234567345   023   131共8学分 学分


还有一组数据,上面的数字,一定是3个数字一起的

我想吧最后那个5分6分转换成大写的 五分六分   八分

就是后面数字 转换成大写的一二三四五六七八九。

前面的三个连续数字不动

结果:数学 123234567345   023   146学分 五分


dim $str ,$arrays

$arrays = "语文 453234567345   023   131共8学分 学分"

$arrays = StringRegExp($str, '语文(\V+)分', 2)
If @extended Then
        $sText1 = $arrays)]
        $sText = StringReplace($sText1, "11", "十一")
        $sText = StringReplace($sText, "12", "十二")
        $sText = StringReplace($sText, "13", "十三")
        $sText = StringReplace($sText, "14", "十四")
        $sText = StringReplace($sText, "15", "十五")
        $sText = StringReplace($sText, "16", "十六")
        $sText = StringReplace($sText, "17", "十七")
        $sText = StringReplace($sText, "18", "十八")
        $sText = StringReplace($sText, "19", "十九")
        $sText = StringReplace($sText, "20", "二十")
        $sText = StringReplace($sText, "10", "十")
        $sText = StringReplace($sText, "1", "一")
        $sText = StringReplace($sText, "2", "二")
        $sText = StringReplace($sText, "3", "三")
        $sText = StringReplace($sText, "4", "四")
        $sText = StringReplace($sText, "5", "五")
        $sText = StringReplace($sText, "6", "六")
        $sText = StringReplace($sText, "7", "七")
        $sText = StringReplace($sText, "8", "八")
        $sText = StringReplace($sText, "9", "九")
        $str = StringReplace($str, $sText1, $sText)
EndIf


MsgBox(4096, "正则测试 标志值 3 - " , $str )

5735988 发表于 2026-1-24 13:06:26

用分割不知道行不行?先把前面的 连续3个数字提取为第一段,   后面的在转换,这个应该可以。
页: [1]
查看完整版本: 中文数字正则提取,请教。(已解决)