正则表达式新行问题

时间:2014-11-18 15:05:00

标签: regex

我正在使用正则表达式下方来验证文本区域是否没有任何网址。

"@"(?!.*?(https?://)?([a-zA-Z0-9_.,\s-]+)\.([a-z.]{2,6})([/\w .-]*)*/?)*"

我已经在一行上试过并测试了这个表达式,但它有效,但在多行文本区域,它在按下enter键时失败(新行)

1 个答案:

答案 0 :(得分:0)

你提到你正在使用C#,但没有提到你是如何使用正则表达式的。我假设您只是对字符串中存在链接进行简单验证。

如果您执行简单的Regex.IsMatch()Regex.Matches(),则会搜索新的行边界。如果你提供了你正在使用它的功能,那么就可以更容易地解释你的版本无法正常工作的原因,但是有一些功能只会搜索第一个匹配并停止。即。 Regex.Match()

大多数人开始关注RegexOptions.SinglelineRegexOptions.Multiline。这些会改变你的正则表达式的行为,但它可能不是你所追求的。 Singleline更改点(.)以匹配换行符,Multiline允许锚标记^$匹配每一行而不是整个字符串。

例如,你可以这样做:

var regex = @"(?!.*?(https?://)?([a-zA-Z0-9_.,\s-]+)\.([a-z.]{2,6})([/\w .-]*)*/?)*";

var str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
            Integer vitae enim nibh. Nam mi ligula, congue sit amet http://www.google.com
            viverra ut, egestas id tortor. Sed ac ex sollicitudin, viverra eros nec, 
            malesuada nibh. Maecenas sollicitudin eros in dui tincidunt, non consectetur mi vulputate. 
            Etiam massa purus, mollis vitae suscipit ut, lobortis sed lectus. Sed egestas ligula sed velit ullamcorper pretium. Etiam lacinia ex dapibus imperdiet elementum. 
            Nam dapibus nibh ante, quis malesuada erat euismod quis. Duis interdum id nisi nec iaculis.";

if (Regex.IsMatch(str, regex, RegexOptions.IgnoreCase))
{
    //The string contains a link
}

现在你要考虑的另一件事是简化你的正则表达式。如果您只是验证文本不包含链接,那么就没有理由在周围文本上进行匹配。所以我个人删除了负面看并简化了正则表达式。

(?:https?://)?(?:[a-zA-Z0-9_.,\s-]+)\.(?:[a-z.]{2,6})(?:[/\w .-]*)*/?

如果你正在根据链接进行某种类型的文本操作,这将不起作用,但是对于简单的验证,它将正常工作。

修改

要使MVC属性RegularExpressionAttribute起作用,您需要使用以下正则表达式。

^(?!.*?(https?://)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*/?)(?:[\r\n]|.)*$

这里的问题是传递Singleline模式的正则表达式选项并不容易。另一个更清洁的解决方案是扩展Attribute类并创建自己的验证器。与此SO question上建议使用的内容类似。

以下是来自其他SO question的代码段,展示了如何创建验证程序以允许正则表达式选项。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, 
                         AllowMultiple = false)]
public class RegExAttribute : ValidationAttribute
{
    public string Pattern { get; set; }
    public RegexOptions Options { get; set; }

    public RegExAttribute(string pattern) : this(pattern, RegexOptions.None) { }
    public RegExAttribute(string pattern, RegexOptions options)
    {
        Pattern = pattern;
        Options = options;
    }

    public override bool IsValid(object value)
    {
        return Regex.IsMatch(value.ToString(), Pattern, Options);
    }
}