Java RegEx 메타 문자 (.) 및 일반 점?


150

Java RegEx .에서 문장에서 사용하는 메타 문자와 일반 점 의 차이점을 찾는 방법 . 너무 같은 다른 메타 문자에 대한 이런 종류의 상황을 처리하는 방법 ( *, +, \d, ...)

답변:


276

정규 표현식에서 특별한 의미의 점이나 다른 문자를 일반 문자로 사용하려면 백 슬래시로 이스케이프 처리해야합니다. Java의 정규 표현식은 일반적인 Java 문자열이므로 백 슬래시 자체를 이스케이프해야합니다. 따라서 두 개의 백 슬래시가 필요합니다.\\.


1
이 수정 사항은 bash
krivar

18
백 슬래시를 벗어날 지 여부는 정규식을 제공하는 방법에 따라 다릅니다. 하드 코딩 된 경우 "\\"를 사용해야합니다. 원시 소스 (예 : 텍스트 파일)에서 읽는 경우 단일 백 슬래시 만 사용합니다 : \.
Paul

25

다른 회원들이 제안한 솔루션은 저에게 효과적이지 않습니다.

그러나 나는 이것을 발견했다 :

Java regexp 쓰기에서 점을 벗어나려면 [.]


2
같은, \\.나를 위해 작동하지 않았다 : \.그 불평 ., 이스케이프 할 필요가 없습니다 \\.그것은 생각하게 \.하는 대신 ., \\\.에러 던졌다 빌더, [.]일 유일한 일이었다.
mithunc

1
@mithunc 이상하게도 \\.문자열 리터럴 안에는 \.정규 표현식에서 점을 모든 문자 매처 대신 리터럴 점으로 볼 필요가 있습니다.
klaar

16

Perl 스타일 정규 표현식 (Java 정규식 엔진이 어느 정도 기반)은 다음 문자를 특수 문자로 취급합니다.

.^$|*+?()[{\캐릭터 클래스 이외 의 특별한 의미를 가지고

]^-\문자 클래스 에서 특별한 의미를 갖습니다 ( [...]).

따라서 컨텍스트에 따라 해당 기호 (및 해당 기호 만)를 이스케이프해야합니다 (또는 문자 클래스의 경우 잘못 해석 할 수없는 위치에 배치).

다른 문자를 피하는 것은 당연히 가능하지만 일부 정규식 엔진은이를 구문 오류로 처리합니다. 예를 들어 \_.NET에서 오류가 발생합니다.

예를 들어 , Perl에서는 \<리터럴 <로 해석 되지만 egrep"단어 경계"라는 의미 로 잘못된 결과 가 발생할 수 있습니다.

쓰기 그래서 -?\d+\.\d+\$경기에 1.50$, -2.00$등을 [(){}[\]]괄호 / 중괄호 / 괄호의 모든 종류와 일치하는 문자 클래스.

사용자 입력 문자열을 정규식으로 안전한 형식으로 변환해야하는 경우을 사용하십시오 java.util.regex.Pattern.quote.

더 읽을 거리 : Jan Goyvaert의 메타 문자 탈출에 대한 RegexGuru 블로그


4

백 슬래시로 특수 문자를 피하십시오. \., \*, \+, \\d,과에 이렇게. 확실하지 않은 경우 비 알파벳 문자는 특수한지 여부에 관계없이 피할 수 있습니다. 자세한 정보 는 java.util.regex.Pattern에 대한 javadoc을 참조하십시오 .


비 특수 문자를 피하는 것은 불필요하게 일부 언어에서는 작동하지만 다른 언어에서는 실패 할 수 있으므로 습관을 들이지 않는 것이 좋습니다.
Tim Pietzcker

1
이 질문은 자바에 관한 것이지만 docs.oracle.com/javase/6/docs/api/java/util/regex/… 라고 말합니다. 이스케이프 처리되지 않은 구조의 일부입니다. "
Christoffer Hammarström

2

다음은 붙여 넣기를 직접 복사 할 수있는 코드입니다.

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

실수로 "."앞뒤에 공백이 있으면 어떻게됩니까? 그런 경우는? 이러한 공간도 항상 고려하는 것이 가장 좋습니다.

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

여기서 \\ s *는 공백을 고려하여 필요한 분리 문자열 만 제공합니다.


1

". *"로 끝나는 문자열을 일치 시키려면 다음을 사용해야했습니다.

"^.*\\.\\*$"

당신이 그것에 대해 생각하면 바보 : D 여기에 무슨 뜻인지. 문자열의 시작 부분에는 문자 "0"이 있고 그 뒤에 점 "."이있을 수 있습니다. 문자열 끝에 별표 (*)가옵니다.

나는 이것이 누군가에게 유용하기를 바랍니다. Fabian의 백 슬래시에 감사드립니다.


그냥 사용하십시오 "\\.\\*$". 중요하지 않은 문자열의 시작 부분과 일치하지 않아도됩니다.
Ophidian 2019

그래 정확 해. 솔직히 말해서, 이것에 대한 유스 케이스를 기억할 수 없습니다 : /
Atspulgs

실제로 당신을 도와주는 것이 아니라 다른 사람들이 귀하의 게시물을 보도록 도와
주었습니다


0

JGrasp에서 몇 가지 기본 배열을 수행하고 char [] [] 배열에 대한 접근 자 메서드를 사용하여 단일 점을 배치하기 위해 ( '.')을 사용한다는 것을 알았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.