您提到您正在使用 C#,但没有提到您如何使用正则表达式。我假设您只是对字符串中是否存在链接进行简单验证。
如果您执行简单的Regex.IsMatch() 或Regex.Matches(),那么它将搜索新的行边界。如果你提供你正在使用的函数,它会更容易解释你的版本为什么不工作,但是有一些函数只会搜索第一个匹配并停止。 IE。 Regex.Match()
大多数人开始关注RegexOptions.Singleline 或RegexOptions.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);
}
}