简化我的正则表达式(c#中的许多建议都不起作用,我已经尝试过了)

本文关键字:不起作用 过了 正则表达式 我的 许多建 | 更新日期: 2023-09-27 18:05:48

有人能简化我的正则表达式吗?经过多次测试和尝试,我设计了它。请不要根据JS规则简化,他们似乎工作不同。否则我就自己动手了。

"^[M]{0,3}([C]{1}[M]{1}){0,1}[D]{0,3}([C]{1}[D]{1}){0,1}[C]{0,3}([X]{1}[C]{1}){0,1}[L]{0,3}([X]{1}[L]{1}){0,1}[X]{0,3}([I]{1}[X]{1}){0,1}[V]{0,3}([I]{1}[V]{1}){0,1}[I]{0,3}$"

所有有顺序的字符都是必须的。

添加一些规则。这是一些罗马数字系统根据我的要求…

数字是由符号组合和数值相加而成的。例如,MMVI = 1000 + 1000 + 5 + 1 = 2006。通常,符号是按照值的顺序排列的,从最大的值开始。当较小的值在较大的值之前时,较小的值从较大的值中减去,并将结果加到总数中。例如:MCMXLIV = 1000 +(1000−100)+(50−10)+(5−1)= 1944

符号"I","X","C","M"可以连续重复三次,但不能再重复了。(如果第三个和第四个被较小的值分隔,例如XXXIX,则它们可能出现四次。)"D"、"L"answers"V"永远不能重复。"I"只能从"V"answers"X"中减去。"X"只能从"L"answers"C"中减去。只有"D"answers"M"可以减去"C"。"V", "L"answers"D"永远不能被减去。

一个大值符号只能减去一个小值符号。用[16]阿拉伯数字写成的数字可以分解成数字。例如,1903由1、9、0和3组成。书写罗马数字时,每个非零数字应分别处理。在上面的例子中,1000 = M, 900 = CM, 3 = III。因此,1903 = MCMIII.

简化我的正则表达式(c#中的许多建议都不起作用,我已经尝试过了)

几点说明:

  • 不需要只有一个物品的字符类,所以"[M]"可以用"M"代替(例如)
  • "{0,1}"总是可以用"?"代替,而不会改变正则表达式
  • 的含义
  • 你永远不需要包含"{1}",因为它不会添加任何额外的约束
  • 对于长正则表达式,我建议使用字符串常量将正则表达式分解为逻辑"子组",并使用它们"构建"正则表达式-这更容易阅读
  • 总是在正则表达式的上面包含注释,解释它的目的,并给出有效和无效输入的例子(除非它足够短到明显),否则将很难维护

我还没有像我想的那样彻底地测试它(给出一些有效和无效字符串的例子会更容易),但这里有一个尝试:

"^M{0,3}(CM)?D{0,3}(CD)?C{0,3}(XC)?L{0,3}(XL)?X{0,3}(IX)?V{0,3}(IV)?I{0,3}$"

这将匹配字符串"MDCLXVI",而不是"MMMMDCLXVI"。

话虽如此,我怀疑你原来的regex并没有完全按照你的意图去做,所以这可能不仅仅是一个简化的问题。例如,您在帖子中声明"所有具有序列的字符都是强制性的",但现在不需要特定的字符串序列;事实上,regex甚至会匹配空字符串,我怀疑这不是您想要的。

这个等式现在不能简化,因为我正在尝试验证c#正则表达式处理中的字符串。我已经尝试了许多其他的方法,包括上面提供的建议。

现在结束这个问题

相关文章: