中文数字正则提取,请教。(已解决)
本帖最后由 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
(\V)正(\V)负
(\V)负(\V)正
这个正则都不对。。 本帖最后由 gyp2000 于 2026-1-24 11:14 编辑
Local $sText = "需要处理的数据"
$sText = StringRegExpReplace($sText, '(正[一|二|三])(负[一|二|三])', ' \1\2')
$sText = StringRegExpReplace($sText, '([一|二|三]正)([一|二|三]负)', ' \1\2 ')
$sText = StringRegExpReplace($sText , '(学分)', ' \1 ')
......
先用正则替换将关键字之间替换出空格。
然后将数据使用空格作为分隔符转换成二维数组。
最后检查数组中的每个元素,判断数据类型后格式化输出。
gyp2000 发表于 2026-1-24 11:11
Local $sText = "需要处理的数据"
$sText = StringRegExpReplace($sText, '(正[一|二|三])(负[一|二|三]) ...
老哥,这个代码对我很重要。谢谢。 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) 如果数字之间的空格数量有多有少 可以用 \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') 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 ) 用分割不知道行不行?先把前面的 连续3个数字提取为第一段, 后面的在转换,这个应该可以。
页:
[1]