找回密码
 加入
搜索
查看: 4996|回复: 10

[效率算法] 正则的疑惑?[已解决]

  [复制链接]
发表于 2012-5-18 14:47:02 | 显示全部楼层 |阅读模式
本帖最后由 3mile 于 2012-6-2 08:06 编辑

如字符串:
51230456118234
一句正则取连续自然数,
如:123  456  234

貌似正则不参与运算.有解吗?
求高人指教.
我自己也想过这个问题,只能用笨办法解决.
$abc='51230456118234'
$nub='0123456789'

Local $str=""
for $i=0 to stringlen($nub)-2
  $str=stringmid($nub,$i,3)
  If StringRegExp($abc,$str,0) then 
        $str=True
        ExitLoop
        EndIf
  $str=False
next
MsgBox(0,0,$str)
发表于 2012-5-18 14:57:36 | 显示全部楼层
回复 1# 3mile

自问正则知识上无法跟前辈相比, 自然也就帮不上忙了!
但发现了您发出的代码有点小错:
StringMid 函数截取字符串的最小位置应该从 1 开始, 而不是 0.

评分

参与人数 1金钱 +9 收起 理由
3mile + 9 数组病吧!

查看全部评分

 楼主| 发表于 2012-5-18 15:02:56 | 显示全部楼层
回复 2# user3000
多谢指教.
也许是数组用的多了,都用0基了.

评分

参与人数 1金钱 +10 收起 理由
user3000 + 10 指教不敢当, 前辈一时糊涂罢了!

查看全部评分

发表于 2012-5-18 15:35:35 | 显示全部楼层
本帖最后由 user3000 于 2012-5-18 15:50 编辑

回复 3# 3mile

没事做想了一下, 倒想到'另一种'取巧的 判断方法:
#include <array.au3>
$abc='51230456118234'
$reg = '012'
For $i = 1 To 7
        $reg &= '|' & ($reg + $i*111)
Next
$r = StringRegExp($abc, $reg, 3)
If Not @error Then _ArrayDisplay($r)
或者直接截获所有的3个连续数字后再作判断?
Mod($n-12, 111) = 0 即为自然数
但思来想去, 正则上, 我却作不出如何截取所有的'连续序数' 了!

评分

参与人数 1金钱 +30 收起 理由
3mile + 30 学习了

查看全部评分

发表于 2012-5-18 16:40:50 | 显示全部楼层
$abc='51230456118234'
$nub='0123456789'
 
Local $str=""
for $i=1 to stringlen($nub)-2
  $str=stringmid($nub,$i,3)
  If StringRegExp($abc,"(?s)"&$str,0) then 
        ;$str=True
        ;ExitLoop
                $arr=StringRegExp($abc,"(?s)"&$str,1)
                ConsoleWrite($arr[0]&@CRLF)
        EndIf
  ;$str=False
next
;MsgBox(0,0,$str)
加了个参数,不知这样算不算对

评分

参与人数 1金钱 +30 收起 理由
3mile + 30 学习了

查看全部评分

 楼主| 发表于 2012-5-18 16:51:27 | 显示全部楼层
回复 5# kevinch
无所谓对还是错,只是有点疑惑.
只是疑惑正则可不可以参与运算.
发表于 2012-5-18 21:52:33 | 显示全部楼层
3G的意思是直接一句表达式出结果,不用循环之类的东东。
发表于 2012-5-18 22:02:49 | 显示全部楼层
回复 1# 3mile
只取3位的连续自然数吗?
发表于 2012-5-18 22:28:11 | 显示全部楼层
这个问题今天下午我和3G讨论了很久,私下我也想了很多,都没有成功,甚至于认为纯正则无解。

也许是我太孤陋寡闻了,所以非常期待高人的指点啊!
发表于 2012-5-18 23:19:34 | 显示全部楼层
本帖最后由 Duvet 于 2012-5-18 23:38 编辑

全部列出來也是個辦法???

#Include <Array.au3>
Local $Str = "51230456118234"
Local $Result = StringRegExp($Str, "(0123456789|012345678|01234567|0123456|012345|01234|0123|012?|123456789|1345678|1234567|123456|12345|1234|123?|23456789|2345678|234567|23456|2345|234?|3456789|345678|34567|3456|345?|456789|4568|4567|456?|56789|5678|567?|6789|678?|789?|89)", 3)
;Local $Result = StringRegExp($Str, "(01(?>2(?>3(?>4(?>5(?>6(?>7(?>89?)?)?)?)?)?)?)?|12(?>3(?>4(?>5(?>6(?>7(?>89?)?)?)?)?)?)?|23(?>4(?>5(?>6(?>7(?>89?)?)?)?)?)?|34(?>5(?>6(?>7(?>89?)?)?)?)?|45(?>6(?>7(?>89?)?)?)?|56(?>7(?>89?)?)?|67(?>89?)?|789?|89)", 3)
_ArrayDisplay($Result)

评分

参与人数 2金钱 +80 贡献 +4 收起 理由
lixiaolong + 30 + 2
afan + 50 + 2

查看全部评分

发表于 2012-5-19 00:21:42 | 显示全部楼层
本帖最后由 lixiaolong 于 2012-5-19 00:29 编辑

回复 1# 3mile

一句正则无法实现吧...
#include <array.au3>

$str = '51230456118234'
$regexp = '123|234|456|567|678|789'

$array = StringRegExp($str, $regexp, 3)
If Not @error Then
        _ArrayDisplay($array)
        _ArraySort($array)
        _ArrayDisplay($array)
EndIf


我可能理解错了...
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-18 22:52 , Processed in 0.085147 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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