小小正则[已解决]
本帖最后由 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 ,这是哪出?我想简单了吗?应该怎么整呢 (?<!\d)\d{6}(?!\d)
StringRegExp($a,'(\d{6}),',3)
因为正则是从左到右来的,只有这两个 '100001, ,300003, 符合数字两边是非数字字符串
itzyx 发表于 2022-9-14 09:42
StringRegExp($a,'(\d{6}),',3)
因为正则是从左到右来的,只有这两个 '100001, ,300003, 符合数字两边 ...
主要我还想匹配像这种
Local $a='{"{"words":"100001\200002/300003|400004#1569821099401685276"}'
就是6位数字是确定的,前后有非数字,但非数字是什么不想固定,怎么办 z761003 发表于 2022-9-14 09:52
主要我还想匹配像这种
Local $a='{"{"words":"100001\200002/300003|400004#1569821099401685276"}'
...
如果格式都是这样形式的话
StringRegExp($a,'(\d{6})[^\d^"]',3) 可以这样,暂时只想到这个,等A大一会看到,有没有好的方法。 \b\d{6}\b
用边界判断 zghwelcome 发表于 2022-9-14 10:48
\b\d{6}\b
用边界判断
为啥\b可以当做边界,这个不是单词的开头结束嘛,还有大佬一开始的零宽断言方法怎么删了,感觉也行啊。 itzyx 发表于 2022-9-14 10:58
为啥\b可以当做边界,这个不是单词的开头结束嘛,还有大佬一开始的零宽断言方法怎么删了,感觉也行啊。
没有删,不管用什么方法,能达到要求就行 zghwelcome 发表于 2022-9-14 11:00
没有删,不管用什么方法,能达到要求就行
哦哦 看错了 置顶了,牛啊正则还是要多学习,第一方法看得懂,第二个边界没弄明白 itzyx 发表于 2022-9-14 11:03
哦哦 看错了 置顶了,牛啊正则还是要多学习,第一方法看得懂,第二个边界没弄明白
\b 不一定是单纯的单词边界,而是 \w 的边界,即数字字母下划线 \D(\d{6})\D 这种写法中的 \D 是占字符的,即匹配 100001 及 300003 后消耗掉了,不能做下一次匹配,另外两个没有 \D 匹配,因此匹配不到。
用断言的方式是不占字符的,匹配的字符还能继续用于下一次匹配。zghwelcome 给出的 (?<!\d)\d{6}(?!\d) 就是对的,同理 (?<=\D)\d{6}(?=\D) 也是ok的~ afan 发表于 2022-9-14 11:44
\b 不一定是单纯的单词边界,而是 \w 的边界,即数字字母下划线
谢谢A大,学习了,当时看30min学习正则 那篇文章,以为\b单纯的是单词边界呢 谢谢大佬,小小正则看来也不是这么简单的,要认真学习下
页:
[1]