2014-11-18 2 views
-1

아래 정규 표현식을 사용하여 텍스트 영역의 유효성을 검사하지 않고 URL을 확인합니다.정규식 새 라인 문제

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

나는 시도하고 한 줄에이 표현을 테스트, 그것은 일을하지만, 입력 (새로운 라인) 당신은 C#을 사용하고 언급

+0

m 플래그를 사용해 보셨습니까? –

+0

@Avinash Rah 그것의 C# MVC 응용 프로그램 – Moe

+0

@ Zach 아니오 m 플래그를 시도하지 않았습니다. – Moe

답변

0

을 타격 할 때 여러 줄 텍스트 영역에 실패하지만, 한 어떻게 정규 표현식을 사용하는지 언급하지 않았습니다. 난 당신이 문자열 내에 링크의 존재에 대한 간단한 유효성 검사를하고 있다고 가정합니다.

간단한 Regex.IsMatch() 또는 Regex.Matches()을 입력하면 새 줄 경계를 검색합니다. 사용중인 기능을 제공하면 버전이 작동하지 않는 이유를 쉽게 설명 할 수 있지만 첫 번째 일치 항목 만 검색하고 중지하는 몇 가지 기능이 있습니다. 즉. 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); 
    } 
} 
+0

MVC 데이터 주석을 사용하고 있습니다. [RegularExpression ("REGEXP", "ERROR")] – Moe

+0

이 정규 표현식을 사용하여 임 "^ (?!. *? (https? : //)? ([\ da-z. -] +) \. ([az.] {2,6}) ([/ \ w .-] *) * /?). * $ "; 언급 한 바와 같이, 그것은 한 줄에 잘 작동하지만, 언제든지 reg exp가 실패하면 엔터를 치십시오. – Moe

+0

@Nusir : '@'(?!. *?) ([\ da-z.-] +) \. ([a-z.] {$ 2}). $ {\} {\ r \ n \ n " 하지만 필요한 것은'RegexOptions.Singleline'을 활성화하는 것입니다. – Nathan