z761003 发表于 2022-9-14 08:48:48

小小正则[已解决]

本帖最后由 z761003 于 2022-9-14 18:02 编辑

Local $a='{"{"words":"100001,200002,300003,400004,1569821099401685276"}'
$b=StringRegExp($a,'\D(\d{6})\D',3)
_ArrayDisplay($b)
本以为用这个正则就能轻松取出 100001,200002,300003,400004这四组数字,毕竟意思也解释得通,中间6个数字头尾至少各一个非数字,,,可结果看了出意料,出来的仅有100001和300003 ,这是哪出?我想简单了吗?应该怎么整呢

zghwelcome 发表于 2022-9-14 10:36:02

(?<!\d)\d{6}(?!\d)

itzyx 发表于 2022-9-14 09:42:20

StringRegExp($a,'(\d{6}),',3)
因为正则是从左到右来的,只有这两个 '100001, ,300003, 符合数字两边是非数字字符串

z761003 发表于 2022-9-14 09:52:23

itzyx 发表于 2022-9-14 09:42
StringRegExp($a,'(\d{6}),',3)
因为正则是从左到右来的,只有这两个 '100001, ,300003, 符合数字两边 ...

主要我还想匹配像这种
Local $a='{"{"words":"100001\200002/300003|400004#1569821099401685276"}'
就是6位数字是确定的,前后有非数字,但非数字是什么不想固定,怎么办

itzyx 发表于 2022-9-14 10:32:39

z761003 发表于 2022-9-14 09:52
主要我还想匹配像这种
Local $a='{"{"words":"100001\200002/300003|400004#1569821099401685276"}'
...

如果格式都是这样形式的话
StringRegExp($a,'(\d{6})[^\d^"]',3)   可以这样,暂时只想到这个,等A大一会看到,有没有好的方法。

zghwelcome 发表于 2022-9-14 10:48:13

\b\d{6}\b
用边界判断

itzyx 发表于 2022-9-14 10:58:30

zghwelcome 发表于 2022-9-14 10:48
\b\d{6}\b
用边界判断

为啥\b可以当做边界,这个不是单词的开头结束嘛,还有大佬一开始的零宽断言方法怎么删了,感觉也行啊。

zghwelcome 发表于 2022-9-14 11:00:35

itzyx 发表于 2022-9-14 10:58
为啥\b可以当做边界,这个不是单词的开头结束嘛,还有大佬一开始的零宽断言方法怎么删了,感觉也行啊。

没有删,不管用什么方法,能达到要求就行

itzyx 发表于 2022-9-14 11:03:23

zghwelcome 发表于 2022-9-14 11:00
没有删,不管用什么方法,能达到要求就行

哦哦 看错了 置顶了,牛啊正则还是要多学习,第一方法看得懂,第二个边界没弄明白

afan 发表于 2022-9-14 11:44:08

itzyx 发表于 2022-9-14 11:03
哦哦 看错了 置顶了,牛啊正则还是要多学习,第一方法看得懂,第二个边界没弄明白

\b 不一定是单纯的单词边界,而是 \w 的边界,即数字字母下划线

afan 发表于 2022-9-14 11:52:10

\D(\d{6})\D 这种写法中的 \D 是占字符的,即匹配 100001 及 300003 后消耗掉了,不能做下一次匹配,另外两个没有 \D 匹配,因此匹配不到。
用断言的方式是不占字符的,匹配的字符还能继续用于下一次匹配。zghwelcome 给出的 (?<!\d)\d{6}(?!\d) 就是对的,同理 (?<=\D)\d{6}(?=\D) 也是ok的~

itzyx 发表于 2022-9-14 11:58:18

afan 发表于 2022-9-14 11:44
\b 不一定是单纯的单词边界,而是 \w 的边界,即数字字母下划线

谢谢A大,学习了,当时看30min学习正则 那篇文章,以为\b单纯的是单词边界呢

z761003 发表于 2022-9-14 18:02:22

谢谢大佬,小小正则看来也不是这么简单的,要认真学习下
页: [1]
查看完整版本: 小小正则[已解决]