2013-01-05 4 views
4

bash에서 정규 표현식을 사용하여 일부 전자 메일 주소를 일치 시키려고합니다. 현재 추가하려고하지만 때, 성공적으로 내가 필요한 모든 이메일과 일치하는 표현Bash Regex 전자 메일 일치

"^[a-zA-Z0-9!#\$%&'\*\+/=?^_\`{|}~-]+(\.[a-zA-Z0-9!#\$%&'\*\+/=?^_\`{|}~-]+)*@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\$" 

을받은 "다음"필드 내가 어떤 경기를 얻을 수가 어차피 내가 왜 모르겠어요. 이것은받는 사람 필드가있는 내 코드입니다. ? AFAIK는 "받는 사람 : [email protected]"로 벌금을 일치해야

"^To:\s[a-zA-Z0-9!#\$%&'\*\+/=?^_\`{|}~-]+(\.[a-zA-Z0-9!#\$%&'\*\+/=?^_\`{|}~-]+)*@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\$" 

하지만 에게 어떤 조언을 :(하지 않습니다

예를 코드에서

Reply-To: "[email protected]" <[email protected]> 
To: [email protected] 
Date: Mon, 21 Jun 2012 21:34:10 -0300 

코드 파일을 검색하고 배열에 추가하는 데 사용

regex="^[a-zA-Z0-9!#\$%&'\*\+/=?^_\`{|}~-]+(\.[a-zA-Z0-9!#\$%&'\*\+/=?^_\`{|}~-]+)*@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\$" 


for i in $(cat mailbox.mbx); do 
    if [[ $i =~ $regex ]]; then 
    echo $i 
    sortarray[$index]=$i 
    index=$(($index+1)) 
    fi 
done 
+0

그래서 당신의 문자열이 포함되어 있습니까 [이메일] 태그 여부 :이 정규 표현식을 생성하는 펄 모듈 Email::Address이있다? 이메일이 공백으로 끝나나요? 전체 문자열 게시 – VladL

+0

죄송합니다. 사본 붙여 넣기에서 자동 입력되었습니다. 이제 정확히되어야합니다. –

+0

전자 메일이 포함 된 전체 문자열을 게시하십시오. – VladL

답변

3

bash는 정규 표현식에 저장되어있는 펄 틱 \s. posix-ish [[:space:]]을 사용해야합니다. 또한 여기에 한정 기호를 추가해야합니다.

나는 앵커가 $regex에 있다는 것을 알고 있습니다.

이 같은 대규모 정규 표현식

, 나는 단편을 구축하고자 :

물론
char='[[:alnum:]!#\$%&'\''\*\+/=?^_\`{|}~-]' 
name_part="${char}+(\.${char}+)*" 
domain="([[:alnum:]]([[:alnum:]-]*[[:alnum:]])?\.)+[[:alnum:]]([[:alnum:]-]*[[:alnum:]])?" 
begin='(^|[[:space:]])' 
end='($|[[:space:]])' 

# include capturing parentheses, 
# these are the ** 2nd ** set of parentheses (there's a pair in $begin) 
re_email="${begin}(${name_part}@${domain})${end}" 

line="To: [email protected]" 

[[ $line =~ $re_email ]] && echo ${BASH_REMATCH[2]} 
# prints: [email protected] 

이 이메일 주소는 놀랍게도 복잡 - http://www.w3.org/Protocols/rfc822/#z8 - 그리고 의견과 공백은 어느 곳에서나 허용되어야한다. 사실 (hi there) "My First Name".lastname (another comment) @ domain.(really)invalid은 유효한 주소로 간주되어야합니다.

$ perl -MEmail::Address -E 'say $Email::Address::addr_spec' 
(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\\,."\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\\,."\s]+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*"(?-xism:(?-xism:[^\\"])|(?-xism:\\(?-xism:[^\x0A\x0D])))+"(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*))\@(?-xism:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\\,."\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\\,."\s]+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*\[(?:\s*(?-xism:(?-xism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D]))))*\s*\](?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*))) 
+0

대단한 설명, 매우 유익하고 실제로 도움이됩니다. 특히 정규 표현식을 분리하고 av를 통해 재 작성하는 것이 좋습니다. ariable. –

1

이 정규식이 필요한 문자열과 일치해야합니다

"^To: ([email protected]+)$" 

이메일이 이해하지 못하는 $1

+0

두렵지 않고 "받는 사람 :"이 없으면 전자 메일과 일치하지만 일치하는 항목이 없습니다. 또한 원래 정규 표현식을 구현해야합니다 (또는 가능하면 가깝지만 초기 To :가 발견되면이를 고칠 수 있습니다.) 주제에 코드를 추가했습니다. –

+0

답장의 경우 @DanFarrall : 전자 메일은 ** "**으로 시작하고 끝나지 만받는 사람의 경우 : 그렇지 않습니다. 올바른지 확인하십시오. – VladL

+0

맞습니다. 현재 만 해당 : 문제. –

관련 문제