정규식에서“모든 문자”를 일치시키는 방법?


304

다음이 일치해야합니다.

AAA123
ABCDEFGH123
XXXX123

내가 할 수있는 일 : ".*123"?


2
이 링크는 작동하는 것처럼 보이는 접근 방식을 보여줍니다.-> [^] + '문자와 일치하지 않음'을 의미합니다. 이는 '모든 문자와 일치'로 다시 읽을 수있는 이중 음수입니다. 출처 -loune.net/2011/02/…
HockeyJ

답변:


643

그래 넌 할수있어. 작동합니다.

  • . = 어떤 문자
  • \. = 실제 도트 문자
  • .?= .{0,1}= 모든 문자를 0 번 또는 1 번 일치
  • .*= .{0,}= 모든 문자를 0 번 이상 일치
  • .+= .{1,}= 모든 문자를 한 번 이상 일치

22
항상 점은 모든 문자를 의미하지 않습니다. 단일 회선 모드 인 경우 예외입니다. \ p {all}은
martian

이 문자 목록에 슬래시를 어떻게 포함시킬 수 있습니까?
검색 결과 웹 결과 Pi

1
@pippilongstocking 뒤로 슬래시는`\\`입니다
Poutrathor

58

예, 작동하지만 표현식을 컴파일 할 때 DOTALL 플래그 .를 전달하지 않으면 개행과 일치하지 않습니다 .

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();

11
그것은 매우 유용한 정보입니다! .줄 바꿈과 일치 한다고 가정했습니다 . 나는 당신의 대답을 읽게되어 기쁩니다. 나는 그것을 사용해야합니다!
벤 케인

Eclipse에서 여러 줄 정규식 검색을 수행 할 때나 정규식 검색을 제공하는 Java 응용 프로그램의 사용자와 같이 Pattern.DOTALL을 전달할 수없는 컨텍스트에서 Java 정규식의 줄 바꿈과 일치해야하는 경우도 있습니다. regular-expression.info의 가이드를 기반 {.,\n,\r,\u2028,\u2029,\u0085}으로 모든 문자를 일치시키는 데 사용해야 할 수도 있습니다 (유니 코드 문자는 .Java에서 일치하지 않는 추가 행 종료 문자입니다 ). 그러나 {.,\n,\r}대부분의 텍스트 파일 에서만 작동합니다.
시어 도어 머독

8
@TheodoreMurdock [\s\S]은 DOTALL을 사용할 수없는 경우 모든 문자를 일치시키는 인기있는 방법입니다.
mpen

JDK-6337993(?:.|\\v)* 때문에 마음에 들지 않으면 사용하지 마십시오 .
Olivier Cailloux

22

패턴 .을 사용하여 임의의 문자를 한 번 일치 시키고 , .*임의의 문자를 0 번 이상 .+일치시키고 , 임의의 문자를 1 회 이상 일치 시키십시오.


11

정교한 정규식 테스트 및 개발 도구가 많이 있지만 Java로 간단한 테스트 하네스를 원한다면 다음과 같이 사용할 수 있습니다.

    String[] tests = {
        "AAA123",
        "ABCDEFGH123",
        "XXXX123",
        "XYZ123ABC",
        "123123",
        "X123",
        "123",
    };
    for (String test : tests) {
        System.out.println(test + " " +test.matches(".+123"));
    }

이제 새로운 테스트 케이스를 쉽게 추가하고 새로운 패턴을 시도 할 수 있습니다. 정규 표현식을 탐험하는 재미를 즐기십시오.

또한보십시오


1
regular-expressions.info 링크만을 위해 투표하십시오. 정규 표현을 배우고 참고하기에 훌륭한 사이트입니다.
Freiheit

9

아니요, *0 개 이상의 문자와 일치합니다. +대신 하나 이상을 일치시키는을 사용해야 합니다.

이 표현은 당신에게 더 효과적 일 수 있습니다 : [A-Z]+123


1
여기서 찬성하십시오. OP는 지정하지 않았지만 OP가 원하지 않을 수도있는 ### 123, 123123, % $ # 123을 포함한 모든 문자와 패턴이 일치한다는 것을 추가하는 것이 옳은 것 같습니다. @Huusom이 위에서 사용하는 문자 클래스는 모든 OP가 의도 된 대문자 알파벳 문자 만 사용하도록합니다.
techdude

9

내가 이것을 인코딩하는 가장 일반적인 방법은 멤버가 가능한 모든 문자 세트의 파티션을 형성하는 문자 클래스를 사용하는 것입니다.

보통 사람들이 쓰기와 [\s\S]생각 (공백 또는 공백이 아닌), [\w\W], [\d\D], 등 모든 작업을 할 것이다.


2
참고로, regular-expressions.info/dot.html : "JavaScript 및 VBScript에는 점을 줄 바꿈 문자로 일치시키는 옵션이 없습니다. 해당 언어에서는 [\ s \ S]와 같은 문자 클래스를 사용할 수 있습니다. 이 문자는 공백 문자 (줄 바꿈 문자 포함) 또는 공백 문자가 아닌 문자와 일치합니다. 모든 문자가 공백이거나 공백이 아니므로이 문자 클래스는 모든 문자와 일치합니다. "
Dean 또는

7

.*그리고 .+새로운 라인을 제외한 모든 문자에 대한 것입니다.

더블 이스케이프

줄 바꿈을 포함하려는 경우 Java 또는 C ++와 같이 이중 이스케이프가 필요한 언어에 대해 다음 표현식이 작동 할 수도 있습니다.

[\\s\\S]*
[\\d\\D]*
[\\w\\W]*

0 번 이상

[\\s\\S]+
[\\d\\D]+
[\\w\\W]+

한 번 이상.

단일 이스케이프 :

C #, PHP, Ruby, PERL, Python, JavaScript와 같은 일부 언어에는 이중 이스케이프가 필요하지 않습니다.

[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+

테스트

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex_1 = "[\\s\\S]*";
        final String regex_2 = "[\\d\\D]*";
        final String regex_3 = "[\\w\\W]*";
        final String string = "AAA123\n\t"
             + "ABCDEFGH123\n\t"
             + "XXXX123\n\t";

        final Pattern pattern_1 = Pattern.compile(regex_1);
        final Pattern pattern_2 = Pattern.compile(regex_2);
        final Pattern pattern_3 = Pattern.compile(regex_3);

        final Matcher matcher_1 = pattern_1.matcher(string);
        final Matcher matcher_2 = pattern_2.matcher(string);
        final Matcher matcher_3 = pattern_3.matcher(string);

        if (matcher_1.find()) {
            System.out.println("Full Match for Expression 1: " + matcher_1.group(0));
        }

        if (matcher_2.find()) {
            System.out.println("Full Match for Expression 2: " + matcher_2.group(0));
        }
        if (matcher_3.find()) {
            System.out.println("Full Match for Expression 3: " + matcher_3.group(0));
        }
    }
}

산출

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

표현식을 살펴보고 싶다면 regex101.com의 오른쪽 상단에 설명되어 있습니다. 원하는 경우이 링크 에서 일부 샘플 입력과 어떻게 일치하는지 확인할 수도 있습니다.


정규식 회로

jex.im은 정규 표현식을 시각화합니다.

여기에 이미지 설명을 입력하십시오


1
아직 여기에 대답하지 않습니까? stackoverflow.com/a/55149095/5424988
네 번째 새

나는 (\W|\w)*이중 탈출 대신에 좋아한다
Sudip Bhattarai

1
정말 유용한 설명
Nagibaba

5

예제 문제에 대한 구체적인 해결책 :-

시도 [A-Z]*123$일치합니다 123, AAA123, ASDFRRF123. 123사용 하기 전에 적어도 문자가 필요한 경우 [A-Z]+123$.

질문에 대한 일반적인 해결책 (정규 표현식에서 "모든 문자"를 일치시키는 방법) :

  1. 공백을 포함한 것을 찾고 있다면 시도해 볼 수 있습니다 [\w|\W]{min_char_to_match,}.
  2. 공백 이외의 것을 일치 시키려고 시도하면 시도 할 수 있습니다 [\S]{min_char_to_match,}.

2

[^]개행을 포함한 모든 문자와 일치해야합니다. [^CHARS가] 있는 것을 제외한 모든 문자와 일치 CHARS . CHARS 가 비어 있으면 모든 문자와 일치합니다.

자바 스크립트 예 :

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.

시도한 내용을 알려주는 코드를 추가 하시겠습니까?
Jennis Vaishnav 12

1

정규식을 사용해보십시오 .{3,}. 줄 바꿈을 제외한 모든 문자와 일치합니다.


-4

나는 이것을 작동한다 항상 점은 모든 문자를 의미하지 않는다. 단일 회선 모드 인 경우 예외입니다. \p{all}해야한다

String value = "|°¬<>!\"#$%&/()=?'\\¡¿/*-+_@[]^^{}";
String expression = "[a-zA-Z0-9\\p{all}]{0,50}";
if(value.matches(expression)){
    System.out.println("true");
} else {
    System.out.println("false");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.