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
的方式几乎没有其他地方
如果包含
'r'n
的文本通过.Net web service
被自动序列化为CCD_ 7。因此包含'r'n
的字符串在web service
之前和之后变化呼叫如果包含
'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问题中,首先可以有一种更优雅的方法来做到这一点?
您可以使用它在两侧运行^(?:'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 );
}