找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 736|回复: 13

[求助] 致N版:亲,请看过来,这个正则肿么了?

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2016-8-26 13:02:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 /db_自贡黄明儒_ 于 2016-8-26 13:06 编辑

[url=;;http://bbs.xdcad.net/thread-669167-1-1.html]XD::String:RegExpR[/url]
(defun test1 (/ NEW OLD TXT X Y)
  (SETQ txt "5.3A4.5B5.0")
  (setq old '("5.3" "4.5" "5.0"))  
  (setq New '("6.30" "5.50" "6.00"))
  (mapcar '(lambda (x y)
             (setq txt (XD::String:RegExpR x txt y ""))
           )
          old
          New
  )
  txt
)
;;(test1)=>"6.30A5.50B6.00"

(defun test2 (/ NEW OLD TXT X Y)
  (SETQ txt "5.3A4.5B5")
  (setq old '("5.3" "4.5" "5"))  
  (setq New '("6.30" "5.50" "6.00"))
  (mapcar '(lambda (x y)
             (setq txt (XD::String:RegExpR x txt y ""))
           )
          old
          New
  )
  txt
)
;;(test2)=>"6.30A6.00.6.000B6.00"
我是希望数值都是保留2位,(test1)是行的,(test2)就不行了。结果却令人失望,怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-8-26 13:25:28 | 显示全部楼层
本帖最后由 newer 于 2016-8-26 13:26 编辑

你的数据,你重复替换了啊,第一个没问题,是因为每个数字都是不同的第二个,替换和被替换的里面都有5,而你mapcar里面把txt修改了, 所有带5都替换了。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2016-8-26 14:07:57 | 显示全部楼层
newer 发表于 2016-8-26 13:25
你的数据,你重复替换了啊,第一个没问题,是因为每个数字都是不同的第二个,替换和被替换的里面都有5,而 ...

New值是我在old的基础上加减一个数值之后的值,怎么才能一对一替换呢?

点评

你应该把每个数字给提取出来,然后再替换具体的数字 命令: (SETQ txt "5.3A4.5B5") "5.3A4.5B5" 下面这正则找出 非字母的,对你的数据来说。 命令: (xdrx_string_regexps "[^a-zA-z]+" txt) ("5.3" "4.5"  详情 回复 发表于 2016-8-26 14:29
你的代码是中间替换了txt内容,每次替换都是在上一次替换后的基础上新txt再替换。  详情 回复 发表于 2016-8-26 14:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-8-26 14:18:51 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-8-26 14:07
New值是我在old的基础上加减一个数值之后的值,怎么才能一对一替换呢?

你的代码是中间替换了txt内容,每次替换都是在上一次替换后的基础上新txt再替换。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-8-26 14:29:07 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-8-26 14:07
New值是我在old的基础上加减一个数值之后的值,怎么才能一对一替换呢?

你应该把每个数字给提取出来,然后再替换具体的数字

命令: (SETQ txt "5.3A4.5B5")
"5.3A4.5B5"

下面这正则找出 非字母的,对你的数据来说。

命令: (xdrx_string_regexps "[^a-zA-z]+" txt)
("5.3" "4.5" "5")


然后你替换上面这个表
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2016-8-26 14:42:11 | 显示全部楼层
newer 发表于 2016-8-26 14:29
你应该把每个数字给提取出来,然后再替换具体的数字

命令: (SETQ txt "5.3A4.5B5")

("5.3" "4.5" "5")=old,正是用正则表达式提取出来的,我是想将其中的数值全加1

点评

命令: (xdrx_string_regexps "[^0-9.]+" txt) ("A" "B") 用这个提出数字中间的, 你把上面的单独的数字表替换新的后,再和这个字母组合起来。 另外正则表达式的key 好像有个参数,替换的时候保存位置,再替换的  详情 回复 发表于 2016-8-26 14:50
你把原先的要替换 提出来, 单独替换每一个后(这样就不会出现重复替换),再组合。  详情 回复 发表于 2016-8-26 14:45
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-8-26 14:45:07 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-8-26 14:42
("5.3" "4.5" "5")=old,正是用正则表达式提取出来的,我是想将其中的数值全加1

你把原先的要替换  提出来, 单独替换每一个后(这样就不会出现重复替换),再组合。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-8-26 14:50:35 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-8-26 14:42
("5.3" "4.5" "5")=old,正是用正则表达式提取出来的,我是想将其中的数值全加1

命令: (xdrx_string_regexps "[^0-9.]+" txt)
("A" "B")
用这个提出数字中间的, 你把上面的单独的数字表替换新的后,再和这个字母组合起来。

另外正则表达式的key 好像有个参数,替换的时候保存位置,再替换的时候从新的位置开始查找,这样就就避免,你查下正则的手册。

评分

参与人数 1D豆 +10 收起 理由
/db_自贡黄明儒_ + 10 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2016-8-26 15:38:34 | 显示全部楼层
newer 发表于 2016-8-26 14:50
命令: (xdrx_string_regexps "[^0-9.]+" txt)
("A" "B")
用这个提出数字中间的, 你把上面的单独的数字 ...

这招还是比较麻烦,没有比这个更省的招术么?

点评

代码再优化下就这样:  详情 回复 发表于 2016-8-26 17:46
或者:  详情 回复 发表于 2016-8-26 17:26
试试: 把字符串里面数字加1。"5.3A4.5B5" 整数或者实数你自己在修改修改。  详情 回复 发表于 2016-8-26 17:22
在你的代码里面,mapcar里面,不要对txt赋值,用一个中间变量,变量等于去掉上次替换的子串,循环替换这个子串。 最后把替换后的合并起来。  详情 回复 发表于 2016-8-26 16:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-8-26 16:51:46 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-8-26 15:38
这招还是比较麻烦,没有比这个更省的招术么?

在你的代码里面,mapcar里面,不要对txt赋值,用一个中间变量,变量等于去掉上次替换的子串,循环替换这个子串。 最后把替换后的合并起来。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-8-26 17:22:19 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-8-26 15:38
这招还是比较麻烦,没有比这个更省的招术么?

试试: 把字符串里面数字加1。"5.3A4.5B5"
整数或者实数你自己在修改修改。

  1. (defun test2 ()
  2.   (setq txt "5.3A4.5B5")
  3.   (setq txt1 "")
  4.   (setq old (xd::string:regexps "[0-9.]+" txt ""))
  5.   (setq join (xd::string:regexps "[^0-9.]+" txt "")
  6.         i 0
  7.   )
  8.   (repeat (length join)
  9.     (setq new (vl-prin1-to-string (1+ (atof (nth i old))))
  10.           txt1 (strcat txt1 new (nth i join))
  11.     )
  12.     (setq i (1+ i))
  13.   )
  14.   (setq txt1 (strcat txt1 (vl-prin1-to-string (1+ (atof (last old))))))
  15. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-8-26 17:26:57 | 显示全部楼层
本帖最后由 newer 于 2016-8-26 17:31 编辑
/db_自贡黄明儒_ 发表于 2016-8-26 15:38
这招还是比较麻烦,没有比这个更省的招术么?

或者写个函数:
  1. (defun test2 (txt)
  2.   (setq txt1 "")
  3.   (if (and
  4.         (setq old (xd::string:regexps "[0-9.]+" txt ""))
  5.         (setq join (xd::string:regexps "[^0-9.]+" txt "")
  6.               i 0
  7.         )
  8.       )
  9.     (progn
  10.       (setq new (mapcar
  11.                   '(lambda (x)
  12.                      (vl-prin1-to-string (1+ (atof x)))
  13.                    )
  14.                   old
  15.                 )
  16.       )
  17.       (repeat (length join)
  18.         (setq txt1 (strcat txt1 (nth i new) (nth i join)))
  19.         (setq i (1+ i))
  20.       )
  21.       (setq txt1 (strcat txt1 (last new)))
  22.     )
  23.   )
  24. )


命令: (setq txt "5.3A4.5B5")
"5.3A4.5B5"
命令: (test2 txt)
"6.3A5.5B6.0"
命令: (setq txt "5.3AAA4.5BBBB5")
"5.3AAA4.5BBBB5"
命令: (test2 txt)
"6.3AAA5.5BBBB6.0"


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-8-26 17:46:44 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-8-26 15:38
这招还是比较麻烦,没有比这个更省的招术么?

代码再优化下就这样:

  1. (defun test2 (txt)
  2.   (setq txt1 "")
  3.   (if (and
  4.         (setq old (xd::string:regexps "[0-9.]+" txt ""))
  5.         (setq join (xd::string:regexps "[^0-9.]+" txt "")
  6.               i -1
  7.         )
  8.       )
  9.     (progn
  10.       (apply
  11.         'strcat
  12.         (mapcar
  13.           '(lambda (x)
  14.              (strcat (vl-prin1-to-string (1+ (atof x))) (if (< i (- (length join) 1))
  15.                                                           (nth (setq i (1+ i)) join)
  16.                                                           ""
  17.                                                         )
  18.              )
  19.            )
  20.           old
  21.         )
  22.       )
  23.     )
  24.   )
  25. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2016-8-29 14:50:53 | 显示全部楼层
newer 发表于 2016-8-26 17:46
代码再优化下就这样:
我只是想叙述简单方便,用了old和new,没想倒把您带进沟里去了。
我原来的处理标高只有一个数字,比较容易,后来发现有些是2个数值(绝对标高和相对标高),所以重写。在您8楼指引下写成如下:
  1. ;;(MyH:Public "5.3A-4.5B5.0" -1 2)=>"4.30A-5.50B4.00"
  2. (defun MyH:Public (txt h n / LST NUM X)
  3.   (setq Lst (xd::string:regexps "[-0-9.]+|[^-0-9.]+" txt ""))
  4.   ;;下面不转成字符串居然也行  
  5.   (setq  Lst (mapcar '(lambda (x)
  6.            (cond ((setq num (distof x)) (HH:rtosr1 (+ num h) n))
  7.            (T x)
  8.            )
  9.          )
  10.         Lst
  11.       )
  12.   )
  13.   (apply 'strcat Lst)
  14. )


1.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 10:15 , Processed in 0.459738 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表