이메일 주소를 찾기 위해 다음 정규식을 사용하고 있습니다.
echo "[email protected]" | awk '/^([a-zA-Z0-9_-.\+]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})$/ {print $0}'
하지만 오류가 반환됩니다.
awk: cmd. line:1: error : tent of \{\}
답변1
짧은 버전은 다음을 사용하세요.
$ echo "[email protected]" |
> gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'
실제 오류 메시지가 다음과 같다고 가정합니다.
awk: cmd. line:1: error: Invalid range end: …
그렇다면 당신은 4가지 질문을 갖게 될 것입니다:
대시(
-
)는 명시적인 대시가 아닌 "문자 범위"를 의미합니다.해당 오류 메시지는
-
문자 범위(_
및 ).
내에서 대시( )를 둘러싼 두 문자가 (ASCII) 순서가 아니기 때문에 발생합니다. 문자 범위에서는.-_
오류가 발생하지 않습니다. 하지만 "문자 범위"(.
점과 밑줄 사이의 모든 문자 ) 를 의미하는 것은 아니지만_
명시적인 대시( )와 일치시키려고 합니다-
."대괄호 표현식" 내에서 명시적인 대시를 일치시키려면 대시를 범위의 첫 번째 또는 마지막 문자로 만들어야 합니다. 누구나
[-…]
,[…-]
. 아니면 낙심해서 그것으로부터 도망치세요\-
. 즉, 다음 두 가지 모두 작동합니다.[-a-zA-Z0-9_.+] [a-zA-Z0-9_.+-]
하지만 아니요, 백슬래시는아니요대시를 명시적으로 만드는 일반적인 솔루션입니다. 노력하다:
$ echo 'ab-cd' | grep -Eo '[a\-c]+' ab c
grep regex(확장: 포함)는
-E
대시와 일치하지 않습니다."대괄호 표현식" 안에 있는 것은
+
특별하지 않으므로 이스케이프할 필요가 없습니다("대괄호 표현식" 내부에서 이스케이프하는 것은 나쁜 습관입니다). 이것을 사용하십시오 :^([-a-zA-Z0-9_.+]+)@
점은
.
"개행 문자를 제외한 모든 문자와 일치"하는 특수 문자입니다.
따라서 이를 이스케이프\.
하거나 "대괄호 표현식"을 사용하여[.]
도트 문자를 명시적으로 일치시켜야 합니다. 다음을 사용하십시오.^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.
마지막으로 "간격 표현식"은 역사적 awk 구현에 대한 확장이며 모든 awk에서 작동하지 않을 수 있습니다. 이는 일반적으로 "문제가 되지 않습니다". 하지만 문제가 있는 경우 다음을 사용해야 합니다.
([a-zA-Z][a-zA-Z][a-zA-Z]?[a-zA-Z]?[a-zA-Z]?)$
그러나 GNU awk를 사용 중일 수 있으며 올바른 구문은 다음과 같아야 합니다.
$ echo "[email protected]" |
> gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'
답변2
답변:
echo "[email protected]" | awk '/^([-a-zA-Z0-9_.\+]+)@([-a-zA-Z0-9_.]+).([a-zA-Z]{2,5})$/ {print $0}'
[email protected]
설명하다:
이 문자 의 위치 -
는 간격을 나타낼 수 있으므로 모호합니다. 정규식의 시작 부분으로 이동하거나 이스케이프하면 정상적으로 작동합니다.
추가 정보: 정규식이 작동하는지 확인하세요.웹사이트확실하지 않을 때에는.
올바르게 지적했듯이이삭, 표현식의 마지막 점은 생각한 대로 작동하지 않습니다. .
모든 문자를 나타내며 문자 그대로의 점을 나타내려면 이스케이프해야 합니다.\.
추가 최적화에는 대괄호 안의 문자를 이스케이프 처리하지 않는 것이 포함됩니다. 이는 불필요하기 때문입니다. 나는 \+
첫 번째 문자 집합을 언급하고 있는데 감사해야 합니다.이삭이걸 또 찾았어!
내가 이해할 수 없는 또 다른 점은 왜 이 모든 괄호를 사용하는가입니다 ()
.
사용법을 수정하고 몇 가지 사소한 개선 사항을 제안하는 것 외에도 -
여기서의 기본 주제는 정규식을 사용하여 이메일 주소의 유효성을 검사할 수 있는 기회에 대해 널리 논의되는 것입니다. 이메일 주소를 정확하게 일치시키는 것은 어려운 작업이며 처음 상상했던 것보다 훨씬 더 복잡한 표현이 필요합니다. 이 포럼과 유사한 포럼에서 볼 수 있는 일반적인 관행은 데이터 세트에 작동할 것으로 예상되는 가장 간단한 정규식을 사용하는 것입니다.
답변3
하이픈 -
은 문자 클래스(대괄호 표현)은 문자 범위를 지정합니다. 문자 클래스에 리터럴을 추가하려면 문자 클래스를 이스케이프하거나 문자 클래스의 끝이나 시작 부분(있는 경우 뒤) -
으로 이동해야 합니다 .^
[a-z-]
[-a-z]
[a-z\-A-Z]
7.[...]
^
<하이픈-빼기> 문자는 목록에서 첫 번째(있는 경우 첫 문자 다음) 또는 마지막에 나타나는 경우 그 자체로 처리되거나 범위 표현식에서 끝 범위 지점으로 처리됩니다. 예를 들어,[-ac]
및 표현식은[ac-]
'a', 'c' 또는 '-' 문자와 동일하며 ' a', 'c' 또는 '-'를 제외한 모든 문자와 일치합니다[^-ac]
.[^ac-]
대괄호 표현식이 "-"와 "]"를 모두 지정하는 경우 대괄호 표현식에서 "]"를 먼저 배치하고(있는 경우 "^" 다음) "-"를 마지막에 배치해야 합니다.
답변4
어떤 버전을 사용하고 있나요 awk
?
GNU를 사용할 때 이 명령은 awk
출력을 생성하지 않지만 오류를 발생시키지 않습니다.
이를 사용하면 solaris
awk
다음 오류가 발생합니다.
awk: syntax error near line 1
awk: bailing out near line 1
주의 깊게 읽으십시오 regex
. 이메일 주소와 일치하지 않습니다...