c# - 使用正则表达式匹配递增/递减序列

标签 c# regex

我想匹配任何只包含递增或递减数字的字符串。这意味着这些字符串将被匹配:

123, 234567, 0123456789, 87654, 321

而这些不会:

7891011, 1234566789, 987865, 134

我一直在寻找答案,all I found 说这不可能使用正则表达式来完成。但是,我想在正则表达式中执行此操作,否则会使代码变得一团糟。

感谢您的回答。

最佳答案

从技术上讲,使用前瞻是可能的,但它看起来不太好。

上升模式的逻辑:

  1. 从字符串开头开始
  2. 仅在当前数字后跟下一个数字或字符串结尾时才匹配当前数字。移动到下一个位置。
  3. 重复 2 直到我们到达字符串末尾。

123 的示例:

  1. 从字符串开头开始
  2. 当前交易品种是 0?不,好的,跳过。
  3. 当前符号是 1?是的。后面是 2 还是字符串结尾?是的。好的,转到下一个符号。
  4. 当前交易品种是 2?是的。后面是 3 还是字符串结尾?是的。好的,转到下一个符号。
  5. 当前交易品种是 3?是的。后面是 4 还是字符串结尾?是的。好的,转到下一个符号。
  6. 当前交易品种是 4?不,当前交易品种是 5?不......是字符串的结尾吗?是的。

134 的示例:

  1. 从字符串开头开始
  2. 当前交易品种是 0?不,好的,跳过。
  3. 当前符号是 1?是的。后面是 2 还是字符串结尾?否。错误,不匹配。

匹配升序模式的正则表达式:

^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$

Regular expression visualization

Debuggex Demo

匹配降序模式的正则表达式:

^(?:9(?=8|$))?(?:8(?=7|$))?(?:7(?=6|$))?(?:6(?=5|$))?(?:5(?=4|$))?(?:4(?=3|$))?(?:3(?=2|$))?(?:2(?=1|$))?(?:1(?=0|$))?0?$

Regular expression visualization

Debuggex Demo

组合在一起:

^((?: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?)$

Regular expression visualization

Debuggex Demo

Regex101 Demo

关于c# - 使用正则表达式匹配递增/递减序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26932885/

相关文章:

c# - 如何在 3D 地形上创建 "scorched area"?

c# - 检查变量是否为 double 据类型

python - 使用文件的 startswith 进行多个匹配

javascript - 正则表达式不允许使用连字符和下划线以外的符号

regex - 匹配前后有方括号的特定文本(~行首和行尾)

c# - 如何在 C# 中读取 SNMP MIB 文件?

c# - 是什么原因导致 svcutil 在代理远程服务器时建议使用 netNamedPipeBinding?

c# - 了解随机二维方向矢量生成

java - 解决 JavaCC token 歧义

javascript - JavaScript 中的后向查找。词后空格