C# 正则表达式需要很长时间才能找到匹配项

C# 正则表达式需要很长时间才能找到匹配项,c#,regex,C#,Regex,此正则表达式: @"^(?:\s*)((?:[a-zA-Z]+[\s-]?)+[a-zA-Z]+)(?:\s*)$ 这需要很长时间,在一些复杂的情况下,这是可怕的 你能告诉我如何在Web应用程序的C#开发中优化这个正则表达式吗?问题是(?:[a-zA-Z]+[\s-]?)+会在你的正则表达式中引起大量的回溯,因为它被放在其他模式之间,[\s-]匹配1或0空格或-(也就是说,它是可选的)并且整个子模式被缩减为([a-zA-Z]+)+,这会导致错误 使用 相反,看 详细信息: ^-字符串的开头

此正则表达式:

@"^(?:\s*)((?:[a-zA-Z]+[\s-]?)+[a-zA-Z]+)(?:\s*)$
这需要很长时间,在一些复杂的情况下,这是可怕的


你能告诉我如何在Web应用程序的C#开发中优化这个正则表达式吗?

问题是
(?:[a-zA-Z]+[\s-]?)+
会在你的正则表达式中引起大量的回溯,因为它被放在其他模式之间,
[\s-]
匹配1或0空格或
-
(也就是说,它是可选的)并且整个子模式被缩减为
([a-zA-Z]+)+
,这会导致错误

使用

相反,看

详细信息

  • ^
    -字符串的开头
  • (?!.{36})
    -一旦模式匹配,即如果引擎从字符串开头找到除换行符以外的任何36个字符,则会导致匹配失败的负前瞻)
  • \s*
    -零个或多个空格
  • ([a-zA-Z]+(?:[\s-][a-zA-Z]+)*)
    -第1组:
    • [a-zA-Z]+
      -1个或多个ASCII字母
    • (?:[\s-][a-zA-Z]+)*
      -零个或多个序列:
      • [\s-]
        -空白或
        -
      • [a-zA-Z]+
        -1个或多个ASCII字母
  • \s*
    -0+尾随空格
  • $
    -字符串结尾(尽管后面可能有一个
    \n
    ,如果不需要,请替换为
    \z

你的问题太多了。正则表达式应该做什么,它的定义是什么?另外,设计模式不是一个正确的标签,它写在上面:“请不要在关于文本模式匹配的问题上使用这个标签”哈哈!其实这是一个很清楚的问题。这个问题也很清楚,我正在尝试用RegX来表示美国的“城市”。这需要防止“重做攻击”。^\s*([a-zA-Z]+(?:[\s-][a-zA-Z]+)*)\s*$此正则表达式正在验证我们的要求,但我需要在“允许的最大字符数=35”中再验证一次。可以在保留这些所有验证的同时限制总字符数。EX:我需要将验证最大字符设置为35。@ DekktKuMar是的,在<代码> ^ >代码>之后,添加<代码>((!){ 36 })< /代码>允许在字符串中最多包含35个字符。@ DevkTunkUMAR请考虑接受该答案,如果它对你有用。-现在,这个(??{ 36 })可以解释这个添加的ReXx吗?现在这个(?。{36})regx正在工作。你能解释一下这个规则吗。(?!{36})就像你之前做的一样
^(?!.{36})\s*([a-zA-Z]+(?:[\s-][a-zA-Z]+)*)\s*$