Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简化我的正则表达式(它是C语言的';s#很多建议都不起作用,我已经尝试过了)_C#_Regex - Fatal编程技术网

C# 简化我的正则表达式(它是C语言的';s#很多建议都不起作用,我已经尝试过了)

C# 简化我的正则表达式(它是C语言的';s#很多建议都不起作用,我已经尝试过了),c#,regex,C#,Regex,有人能简化我的正则表达式吗?经过多次测试和尝试,我设计了它。请不要根据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}$" 所有带序列的字

有人能简化我的正则表达式吗?经过多次测试和尝试,我设计了它。请不要根据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”和“V”永远不能重复。 “I”只能从“V”和“X”中减去。“X”只能从“L”和“C”中减去。“C”只能从“D”和“M”中减去。“V”、“L”和“D”永远不能减去

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

几点:

  • 不需要只包含一项的字符类,因此可以将“[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”不同

话虽如此,我怀疑你原来的正则表达式并没有达到你的预期,所以这可能不仅仅是一个简化的问题。例如,您在帖子中声明“所有带序列的字符都是强制性的”,但现在没有特定的字符串序列是必需的;事实上,正则表达式甚至会匹配空字符串,我怀疑这不是您想要的。

几点:

  • 不需要只包含一项的字符类,因此可以将“[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”不同


话虽如此,我怀疑你原来的正则表达式并没有达到你的预期,所以这可能不仅仅是一个简化的问题。例如,您在帖子中声明“所有带序列的字符都是强制性的”,但现在没有特定的字符串序列是必需的;事实上,正则表达式甚至会匹配空字符串,我怀疑这不是您想要的。

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


现在结束这个问题。

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


现在结束这个问题。

删除所有
{1}
,将
[C]
转换为
C
{0,1}
转换为
。对于这样的长正则表达式,我发现使用字符串常量将其分解为“组”,然后将其组装起来很有帮助。如文所述,很难说出你在这里想要实现什么。你能给出一些有效和无效字符串的例子吗?为什么你只使用一个字符的字符类?这与仅仅使用单个字符有什么不同?我同意这里的@adv12。例如,您可以将([C]{1}[M]{1}){0,1}简化为简单的(CM)—不需要字符类,去掉{1},并将{0,1}简化为?-因为你在找文字字符串“CM”。罗马数字?相关:删除所有
{1}
,将
[C]
转换为
C
{0,1}
转换为
。对于这样的长正则表达式,我发现使用字符串常量将其分解为“组”,然后将其组装起来很有帮助。如文所述,很难说出你在这里想要实现什么。你能给出一些有效字符串和无效字符串的例子吗?为什么你只使用单字符串的字符类