2014-10-29 3 views
0

저는 이것을 C#에서 사용하고 있습니다. 나는이 형식의 이메일과 같은 문자열로 시작합니다유효한 전자 메일 형식을 유지하면서 특수 문자를 제거하는 정규식

employee[any characters]@company[any characters].com 

내가 [모든 문자] 조각에서 비 알파벳과 숫자를 제거하고 싶습니다.

예를 들어 나는이 "[email protected] r&a*[email protected]@company98 ';99..com"

"[email protected]"

이 표현은 단순히 다른 곳으로 스페셜의 모든 소요되고 싶은,하지만 난 회사와 하나되기 전에 하나의 @를 마칠. com 전에. 그래서 나는 직원, @ 회사 및 .com 부서를 무시하거나 가려주는 표현이 필요합니다. 어떻게해야할지 모르겠습니다.

var regex = new Regex("[^0-9a-zA-Z]"); //whitelist the acceptables, remove all else. 
+0

정규 표현식 자체가 필요로하는 것 ('@'과'.'도 제거 할 것입니다.)을 사용하면 프로그래밍 언어에 따라 달라집니다. 'var'에서 자바 스크립트를 가정합니까? – dognose

+2

왜 ""[email protected] "이 아닌''[email protected]"'이되어야합니까? – Oriol

+0

@Oriol OP의 두 번째와 세 번째 라인은 질문에 대한 답을 제공해야합니다 ... 항상 시작 형식이며 우리가 원하고있는 것입니다. "@ company"는 항상 전자 메일 도메인의 시작이 될 것입니다. – chrismat

답변

3

다음과 같은 정규식 사용할 수 있습니다 (그래서 .com 유지됩니다)가 (그래서 @company 유지됩니다) company 또는 com 다음에하지 않는

(?:\W)(?!company|com) 

그것은, 특수 문자를 대체 할을 :

[email protected] r&a*[email protected]@company98 ';99..com 

될 것

,
[email protected] 

참조 : 당신은 원하지 않는 문자의 모든 발행 수를 대체 할 g 수정이 필요 http://regex101.com/r/fY8jD7/2

참고. 이 C#에서 기본이다, 그래서 당신은 단순한 Regex.Replace()를 사용할 수 있습니다

https://dotnetfiddle.net/iTeZ4F


업데이트 :

년 OFC. 정규식 (?:\W)(?!com)이면 충분합니다.하지만 일치하는 부분이 여전히 있으므로 #com 또는 ~companion과 같은 부분을 남겨 둡니다. 따라서 은 여전히 ​​입니다. 입력이 - 또는 변환이 100 % 유효하다고 보장 할 수는 없습니다. 필요에 맞게 입력을 살균하는 대신 유효성 검증 오류를 던지는 것을 고려해야합니다.

당신은뿐만 아니라 가지 경우를 처리하기 위해 관리 할 경우에도

- 무엇을, @company 또는 .com가 두 번 나타나는 경우?

+0

감사의 인사말 ...이 시점에서 나는 "@ 회사"를 알고 있으며 .com은 두 번 나타나지 않습니다 ... 소스 데이터가 그 점에 도달하면 우리는 그 사람들과 이야기 할 것입니다 (= 감사합니다. – chrismat

0

당신은 당신의 정규식을 단순화하고 \w 모든 문자, 숫자를 의미하며, 밑줄 및 \W\w의 부정 버전입니다

tmp = Regex.Replace(n, @"\W+", ""); 

하여 교체 할 수 있습니다. 일반적으로 허용되지 않는 기호를 모두 예측하는 대신 허용 된 문자의 화이트리스트를 만드는 것이 좋습니다. (당신은 대소 문자 구분을해야하는 경우 의견을주십시오 무시 대소 문자 구분)

:

+0

regex가 "employee", "@ company"및 ".com"문자열을 무시하도록 할 수 있습니까? – chrismat

0

아마 뭔가를 작성합니다.

DotNetFiddle Example

using System; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     var email = "[email protected] r&a*[email protected]@company98 ';99..com"; 

     var result = GetValidEmail(email); 

     Console.WriteLine(result); 
    } 


    public static string GetValidEmail(string email) 
    { 
     var result = email.ToLower(); 

     // Does it contain everything we need? 
     if (email.StartsWith("employee") 
      && email.EndsWith(".com") 
      && email.Contains("@company")) 
     { 
     // remove beginning and end. 
     result = result.Substring(8, result.Length - 13); 
     // remove @company 
     var split = result.Split(new string[] { "@company" }, 
      StringSplitOptions.RemoveEmptyEntries); 

     // validate we have more than two (you may not need this) 
     if (split.Length != 2) 
     { 
      throw new ArgumentException("Invalid Email."); 
     } 

     // recreate valid email 
     result = "employee" 
      + new string (split[0].Where(c => char.IsLetterOrDigit(c)).ToArray()) 
      + "@company" 
      + new string (split[1].Where(c => char.IsLetterOrDigit(c)).ToArray()) 
      + ".com"; 

     } 
     else 
     { 
     throw new ArgumentException("Invalid Email."); 
     } 

     return result; 
    } 
} 

결과

[email protected]

+0

나는 이런 식으로 피하는 것이 좋겠지 만 정규 표현식이이 패턴을 처리 할 수 ​​없다면 그렇게해야 할 것이라고 생각합니다. thx – chrismat

+0

옵션이 있습니다. –

0

@dognose는 훌륭한 정규식 솔루션을했다. 나는 나의 대답을 참고로 여기에서 지킬 것이다. 그러나 나는 그와 같이 갈 것이고 훨씬 더 짧고 깨끗하다.

var companyName = "company"; 
var extension = "com"; 
var email = "[email protected] r&a*[email protected]@company98 ';99..com"; 

var tempEmail = Regex.Replace(email, @"\W+", ""); 

var companyIndex = tempEmail.IndexOf(companyName); 
var extIndex = tempEmail.LastIndexOf(extension); 

var fullEmployeeName = tempEmail.Substring(0, companyIndex); 
var fullCompanyName = tempEmail.Substring(companyIndex, extIndex - companyIndex); 

var validEmail = fullEmployeeName + "@" + fullCompanyName + "." + extension; 
+0

사실 ... 주어진 형식이 직원 [모든 문자] @company [모든 문자] .com이 될 것입니다. 우리는 [어떤 문자들]에 무엇이 들어 있을지 모르기 때문에, [임의의 문자들] 섹션들에서 영숫자가 아닌 문자들을 제거하기 만하면됩니다. – chrismat

+0

나는 당신이 지금 묻고있는 것을하기 위해 그것을 고쳤다 고 생각합니다. –

0

가능한 작업은 하나의 정규식 패턴을 사용하여 조금 복잡합니다. 이 시나리오를 더 작은 단계로 나눌 수 있습니다. 이를 수행하는 한 가지 방법은 UsernameDomain 그룹 (본질적으로 [any character]으로 설명한 것)을 추출하고 각 그룹을 "수정"한 다음 원래 그룹으로 대체하는 것입니다. 다음과 같이 입력하십시오 :

// Original input to transform. 
string input = @"[email protected] r&a*[email protected]@company98 ';99..com"; 

// Regular expression to find and extract "Username" and "Domain" groups, if any. 
var matchGroups = Regex.Match(input, @"employee(?<UsernameGroup>(.*))@company(?<DomainGroup>(.*)).com"); 

string validInput = input; 

// Get the username group from the list of matches. 
var usernameGroup = matchGroups.Groups["UsernameGroup"]; 

if (!string.IsNullOrEmpty(usernameGroup.Value)) 
{ 
    // Replace non-alphanumeric values with empty string. 
    string validUsername = Regex.Replace(usernameGroup.Value, "[^a-zA-Z0-9]", string.Empty); 

    // Replace the the invalid instance with the valid one. 
    validInput = validInput.Replace(usernameGroup.Value, validUsername); 
} 

// Get the domain group from the list of matches. 
var domainGroup = matchGroups.Groups["DomainGroup"]; 

if (!string.IsNullOrEmpty(domainGroup.Value)) 
{ 
    // Replace non-alphanumeric values with empty string. 
    string validDomain = Regex.Replace(domainGroup.Value, "[^a-zA-Z0-9]", string.Empty); 

    // Replace the the invalid instance with the valid one. 
    validInput = validInput.Replace(domainGroup.Value, validDomain); 
} 

Console.WriteLine(validInput); 

출력은 [email protected]입니다.

관련 문제