【问题标题】:Regular expression Modification正则表达式修改
【发布时间】:2010-11-11 09:01:42
【问题描述】:

我有一个 asp.net 应用程序,其中有一个 URL 文本框。我正在使用正则表达式进行验证。我的正则表达式是这样的:^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$

但现在我有一项增强功能,例如文本始终保留 http:// 的文本。那时这个表达式的验证必须忽略默认文本(http://)。怎么可能?请帮助我解决这个问题。

【问题讨论】:

    标签: javascript asp.net regex


    【解决方案1】:

    您的表达式与http:// 部分匹配,因此它“保留”了匹配的那部分。如果您要验证的文本框根本不包含该部分,只需从您的正则表达式中删除 (ht|f)tp(s?)\:\/\/

    如果它是文本框的一部分,但您想在匹配后忽略它,那么您可以将捕获括号放在您想要的匹配周围。您的原始正则表达式将如下所示:

    ^(ht|f)tp(s?)\:\/\/([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?)$
    

    现在没有http://ftp:// 等的部分将在反向引用编号3中。

    也就是说,您现在的正则表达式非常糟糕而且不正确(许多不必要的转义、不必要的括号、错误构造的字符类(带有端口号的 URL 将在此处失败),我很确定您不这样做'不想&在那里)...

    使用正则表达式验证 URL 并不容易。你的意图是什么?什么应该有效,什么不应该?

    【讨论】:

    • 我想要验证 http:// 后面部分的表达式。因为 http// 文本总是在显示。
    • 你的意思是它在文本框之外?那么,按照我的回答的第一句话中所述,从正则表达式中删除该部分。
    【解决方案2】:

    你可以试试这个-

    在正则表达式的开头使用 ((ht|f)tp(s?)\:\/\/)?,这使得 http:// 或 ftp:// 成为可选的。

    您的完整正则表达式将是 -

    ^((ht|f)tp(s?)\:\/\/)?[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$
    

    【讨论】:

    • 但如果它在那里,它仍然会被匹配,因此不会像 Dilse Naaz 所期望的那样被忽略。
    • @Tim - 我理解这个问题是匹配没有 http:// 等的网址。你可能是对的,在这种情况下,我认为我们需要从正则表达式中删除 ^((ht|f)tp(s?)\:\/\/)?。但正如你所提到的,它仍然是不正确的,因为还有很多其他不必要的转义
    • 我也不确定为什么 OP 需要从正则表达式匹配中忽略 http://。如果它始终可用并且当前的正则表达式正在工作,为什么要从正则表达式中删除或忽略 http:// 等。我不认为这有任何与性能相关的问题吗?
    • 你的假设是正确的。我想要验证 http:// 后面部分的表达式。因为 http// 文本总是在显示。
    • @Dilse - 不确定我理解正确。您不想验证 http:// 对吗?那么您可以删除我在对 Tim 的评论中提到的第一部分。尽管将其保留在正则表达式中也应该无关紧要,对吗?我不明白您为什么要删除该 http:// 验证。拥有它总是好的。
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 2022-11-19
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多