ASP.NET MultiLine TextBox-RegularExpressionValidator for Max

本文关键字:for Max TextBox-RegularExpressionValidator MultiLine NET ASP | 更新日期: 2023-09-27 18:27:16

背景:我正在开发一个ASP.NET网页,我有一个多行文本框,如下所示

<asp:TextBox ID="textBox1" runat="server" TextMode="MultiLine"></asp:TextBox>

以及一个正则表达式验证器,用于检查下的最大长度

<asp:RegularExpressionValidator ID="validator1" runat="server" ControlToValidate="textBox1" ValidationExpression="^['s'S]{0,10}$" ErrorMessage="You can only enter a maximum of 10 characters"></asp:RegularExpressionValidator>

其想法是将用户输入限制为最多10个字符。如您所知,RegularExpressionValidator同时进行客户端和服务器端验证。

问题:对于具有换行符的用户输入,客户端的字符数似乎小于服务器端的字符数。因此,它通过了客户端验证,但在服务器端验证失败。

这可能是因为在客户端,新行字符是'n,而在服务器端,它是'r'n

知道如何解决这个问题吗?请注意,我需要客户端和服务器端的验证。

测试数据:

Line
Line1

更新:除了上述奇怪之处,.Net 处理'r'n的方式几乎没有其他地方

  1. 如果包含'r'n的文本通过.Net web service被自动序列化为CCD_ 7。因此包含'r'n的字符串在web service之前和之后变化呼叫

  2. 如果包含'r'n的同一文本存储在SQL Server中,则其原样保留'r'n

因此,根据MultiLine TextBox中的值的进一步处理方式,验证逻辑需要更改。在我的例子中,string在到达外部系统之前通过web service,因此@sln建议的regex在两个client and server side validation上都能很好地工作。

但是,如果您将值直接存储在SQL Server中,并希望使用regex验证string,则在从数据库读取和显示时,需要执行其他步骤,如用'n替换'r'n,反之亦然。

也许,验证最大长度字符的整个方法是XY问题的一个例子,在XY问题中,首先可以有一种更优雅的方法来做到这一点?

ASP.NET MultiLine TextBox-RegularExpressionValidator for Max

您可以使用它在两侧运行^(?:'S|[^'S'r'n]|'r?'n){0,10}$

 ^ 
 (?:
      'S              # Not whitespace
   |  [^'S'r'n]       # or, whitespace, not CR or LF
   |  'r? 'n          # or, CR(optional)LF
 ){0,10}
 $

仅限Newline-

 **  Grp 0 -  ( pos 0 , len 10 ) 
Line
Line1

CRLF

 **  Grp 0 -  ( pos 0 , len 11 ) 
Line
Line1

更新时间:
CRLF翻译帮助

我发现这些程序是地球上最快的
它们是单程regex,可以在瞬间进行巨大的兆字节转换
这个伪代码是在C++范例中。

// To Normalize to CRLF 
// -------------------------
// regex  CRLFCRtoCRLF( "(?>''r''n?)|''n" ); // Dot-Net style
regex  CRLFCRtoCRLF( "''r''n?+|''n" ); // Pcre/Perl style
void ReplaceCRLFCRtoCRLF( string& strSrc, string& strDest )
{
    string repl = "''r''n";
    strDest = regex_replace( strSrc, CRLFCRtoCRLF, repl );
}

// To Normalize to LF 
// -------------------------
regex  CRLFCRtoLF( "''r''n|''r(?!''n)" );
void ReplaceCRLFCRtoLF( string& strSrc, string& strDest )
{
    string repl = "''n";
    strDest = regex_replace( strSrc, CRLFCRtoLF, repl );
}

// To find current state (not really needed)
// (Returns true if standalone CR or LF)
// ------------------------------------------
regex  CRorLF( "''A(?>[^''r''n]*)(?>(?:''r''n)+[^''r''n]*)*''z" );
bool IsLoneCRorLF( string& strSrc )
{
    // In this case we are going to try to match an entire
    // string that is free of lone cr's or lf's.
    // Then return the negative of that.
    // This is much faster than using the lookround's,
    // and we need a little speed here.
    return !regex_search( strSrc, CRorLF );
}