我承认,我不是使用正则表达式的忠实粉丝,但我真的很欣赏他们所取得的成就。我也理解它们是如何工作的,但是很长时间的人会让我感到困惑。
我有一个在PHP应用程序中使用的正则表达式,我无法控制它看起来像这样:
/^(https?|ftp)\:\/\/([a-z0-9+\!\*\(\)\,\;\?\&\=\$\_\.\-]+(\:[a-z0-9+\!\*\(\)\,\;\?\&\=\$\_\.\-]+)?@)?[a-z0-9\+\$\_\-]+(\.[a-z0-9+\$\_\-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$\_\-]\.?)+)*\/?(\?[a-z\+\&\$\_\.\-][a-z0-9\;\:\@\/\&\%\=\+\$\_\.\-]*)?(#[a-z\_\.\-][a-z0-9\+\$\_\.\-]*)?$/i
当我使用在线编码工具,或者甚至尝试将\转换为\时,我最终得到的是_上无效/无法识别的编码错误。
但是,我需要验证我的服务提供的URL,这些URL使用上述PHP应用程序提供的API。我.net的编码版本如下所示:
"/^(https?|ftp)\\:\\/\\/([a-z0-9+\\!\\*\\(\\)\\,\\;\\?\\&\\=\\$\\_\\.\\-]+(\\:[a-z0-9+\\!\\*\\(\\)\\,\\;\\?\\&\\=\\$\\_\\.\\-]+)?@)?[a-z0-9\\+\\$\\_\\-]+(\\.[a-z0-9+\\$\\_\\-]+)*(\\:[0-9]{2,5})?(\\/([a-z0-9+\\$\\_\\-]\\.?)+)*\\/?(\\?[a-z\\+\\&\\$\\_\\.\\-][a-z0-9\\;\\:\\@\\/\\&\\%\\=\\+\\$\\_\\.\\-]*)?(#[a-z\\_\\.\\-][a-z0-9\\+\\$\\_\\.\\-]*)?$/i";
这个正则表达式的一个很好的例子是"不接受百分比编码"。或者"没有空格"。我认为这是一个愚蠢的验证级别,我知道如何提供一个有效的网址,但我们有一些百分比编码,因为人们上传带有空格的文件名,所以我必须将它们除去并发送自动电子邮件..你得到了要点。
请帮我弄清楚为什么这个令人讨厌的正则表达式让我适合.net。
答案 0 :(得分:1)
使用字符串文字来避免双重转义,并且@Wiktor指出不要逃避_
。
new System.Text.RegularExpressions.Regex(@"^(https?|ftp)\:\/\/([a-z0-9+\!\*\(\)\,\;\?\&\=\$_\.\-]+(\:[a-z0-9+\!\*\(\)\,\;\?\&\=\$_\.\-]+)?@)?[a-z0-9\+\$_\-]+(\.[a-z0-9+\$_\-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_\-]\.?)+)*\/?(\?[a-z\+\&\$_\.\-][a-z0-9\;\:\@\/\&\%\=\+\$_\.\-]*)?(#[a-z_\.\-][a-z0-9\+\$_\.\-]*)?$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)