我想匹配任何只包含递增或递减数字的字符串。这意味着这些字符串将被匹配:
123, 234567, 0123456789, 87654, 321
而这些不会:
7891011, 1234566789, 987865, 134
我一直在寻找答案,all I found 说这不可能使用正则表达式来完成。但是,我想在正则表达式中执行此操作,否则会使代码变得一团糟。
感谢您的回答。
最佳答案
从技术上讲,使用前瞻是可能的,但它看起来不太好。
上升模式的逻辑:
- 从字符串开头开始
- 仅在当前数字后跟下一个数字或字符串结尾时才匹配当前数字。移动到下一个位置。
- 重复 2 直到我们到达字符串末尾。
123 的示例:
- 从字符串开头开始
- 当前交易品种是 0?不,好的,跳过。
- 当前符号是 1?是的。后面是 2 还是字符串结尾?是的。好的,转到下一个符号。
- 当前交易品种是 2?是的。后面是 3 还是字符串结尾?是的。好的,转到下一个符号。
- 当前交易品种是 3?是的。后面是 4 还是字符串结尾?是的。好的,转到下一个符号。
- 当前交易品种是 4?不,当前交易品种是 5?不......是字符串的结尾吗?是的。
134 的示例:
- 从字符串开头开始
- 当前交易品种是 0?不,好的,跳过。
- 当前符号是 1?是的。后面是 2 还是字符串结尾?否。错误,不匹配。
匹配升序模式的正则表达式:
^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$
匹配降序模式的正则表达式:
^(?:9(?=8|$))?(?:8(?=7|$))?(?:7(?=6|$))?(?:6(?=5|$))?(?:5(?=4|$))?(?:4(?=3|$))?(?:3(?=2|$))?(?:2(?=1|$))?(?:1(?=0|$))?0?$
组合在一起:
^((?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?|(?:9(?=8|$))?(?:8(?=7|$))?(?:7(?=6|$))?(?:6(?=5|$))?(?:5(?=4|$))?(?:4(?=3|$))?(?:3(?=2|$))?(?:2(?=1|$))?(?:1(?=0|$))?0?)$
关于c# - 使用正则表达式匹配递增/递减序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26932885/