루비 정규 표현식에서 \ A \ z와 ^ $의 차이점


196

내가 읽은 문서에서 :

문자열의 시작과 끝을 일치 시키려면 \ A와 \ z를 사용하고, 줄의 시작과 끝을 ^와 $와 일치시킵니다.

사용자가 제출 한 사용자 이름 (또는 전자 메일이 동일 함)을 확인하기 위해 정규식을 적용하려고합니다. validates_format_of모델에서 어떤 표현을 사용해야 합니까? 나는 그 차이를 이해할 수 없다 : 나는 항상 ^와 $를 사용했다 ...


답변:


226

유효성 검사를 위해 정규식에 의존하는 경우 항상 \A및 을 사용하려고합니다 \z. ^그리고 $그들 만이 같은 이메일을 사용할 수있는 수단 개행 문자까지 일치 me@example.com\n<script>dangerous_stuff();</script>와 정규식 만 전에 모든 것을 볼 수 있기 때문에 여전히이 검증 있습니다 \n.

내 추천은 정당한 이유가 없기 때문에 미리 사용자 이름이나 이메일에서 새로운 줄을 완전히 제거하는 것입니다. 그런 다음 EITHER \A \z또는을 안전하게 사용할 수 있습니다 ^ $.


13
@Ragmaanir이 맞습니다. \z대신 작은 문자가 있어야합니다 \Z!
Petr

11
+1 감사합니다! 나는 당신의 권고에 동의하지 않을 것이지만, A) 적절한 포괄이 있다면 불필요한 작업 / 처리를 추가하지 마십시오 .B) 특히 두 가지를 구별하는 것에 대해 게으른 자세를 유지할 수없는 경우에는 아닙니다. 항상 문자열 조작 위치에 있지는 않지만 Regex에만있을 수 있으므로 올바른 것을 메모리에 커밋하고 차이를 아십시오!
dooleyo

1
위험한 줄에 대한 예제를 이해하지 못했습니다. 어떤 경우 든 줄에 위험한 줄을 포함하거나 줄 바꿈없이 HTML 정리 및 유효성 검사로 수정 해야하는 악용 일 수 있기 때문입니다.
Jayr Motta

2
데모에서 보여준 @JayrMotta는 위험한 것들이 전체 정규식 검사를 완전히 우회 한다는 것입니다 . 따라서 정규식에서 위험한 물건을 검사하더라도 . $대신 "문자열 끝"을 확인 하면 무시됩니다 \z.
닥터 블루

178

에 따르면 곡괭이 :

^ 줄의 시작과 일치합니다.

$ 줄의 끝을 찾습니다.

\A 문자열의 시작과 일치합니다.

\z 문자열의 끝과 일치합니다.

\Z 문자열이로 끝나지 않는 한 문자열의 끝과 "\n"일치합니다 "\n". 이 경우 문자열이 바로 앞과 일치합니다 .

따라서 \A소문자를 사용하십시오 \z. \Z누군가 를 사용 하면 줄 바꿈 문자가 생길 수 있습니다. 이것은 내가 생각하는 위험하지는 않지만 문자열에 공백이 없다고 가정하는 알고리즘을 망칠 수 있습니다. 정규식 및 문자열 길이 제약 조건에 따라 누군가 줄 바꿈 문자와 함께 보이지 않는 이름을 사용할 수 있습니다.

JavaScript의 Regex 구현은 \A리터럴 'A'( ref ) 로 취급 됩니다 . 그러니 거기서 조심하고 테스트하십시오.


16

문자열의 시작과 끝이 반드시 줄의 시작과 끝과 같을 필요는 없습니다. 테스트 문자열로 다음을 사용했다고 상상해보십시오.


이름

앤드류입니다

공지 사항 문자열은 많은 라인을 가지고 - ^$문자는 (기본적으로 치료 그 라인의 시작과 끝과 일치 할 수 있도록 \n하는 동안 분리 문자로 문자를) \A하고 \Z는 전체 문자열의 시작과 끝을 일치시킬 수 있습니다.


1
내 의견으로는 가장 좋은 답변입니다. "기본적으로 \ n 문자를 delimeter로 취급"은 정말 이해하는 데 도움이되었습니다. 감사합니다.
Flyout91

11

예에 따른 차이점

  1. /^foo$/다음 중 하나와 일치 /\Afoo\z/하지 않습니다.
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/그리고 /\Afoo\z/다음의 모든 일치 :
foo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.