[java] 정규 표현식을 사용하여 Java를 사용하여 더 큰 문자열의 하위 문자열 찾기

다음과 같은 문자열이 있으면

FOO[BAR]

문자열에서 “BAR”문자열을 가져 오는 일반적인 방법이 필요하므로 대괄호 사이에 어떤 문자열이 있더라도 문자열을 얻을 수 있습니다.

예 :

FOO[DOG] = DOG
FOO[CAT] = CAT



답변

욕심없는 정량자를 사용할 수 있어야합니다 (특히 *?). 아마도 다음을 원할 것입니다.

Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");

이렇게하면 문자열과 일치하는 패턴을 제공하고 첫 번째 그룹의 대괄호 안에 텍스트를 넣습니다. 자세한 내용 은 Pattern API 설명서 를 참조하십시오.

문자열을 추출하려면 다음과 같은 것을 사용할 수 있습니다.

Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
    String s = m.group(1);
    // s now contains "BAR"
}


답변

비 정규식 방법 :

String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf("["),input.indexOf("]"));

또는 약간 더 나은 성능 / 메모리 사용을 위해 (Hosam 덕분에) :

String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf('['),input.lastIndexOf(']'));


답변

이것은 실제 예입니다.

RegexpExample.java

package org.regexp.replace;

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

public class RegexpExample
{
    public static void main(String[] args)
    {
        String string = "var1[value1], var2[value2], var3[value3]";
        Pattern pattern = Pattern.compile("(\\[)(.*?)(\\])");
        Matcher matcher = pattern.matcher(string);

        List<String> listMatches = new ArrayList<String>();

        while(matcher.find())
        {
            listMatches.add(matcher.group(2));
        }

        for(String s : listMatches)
        {
            System.out.println(s);
        }
    }
}

다음을 표시합니다.

value1
value2
value3


답변

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

public static String get_match(String s, String p) {
    // returns first match of p in s for first group in regular expression 
    Matcher m = Pattern.compile(p).matcher(s);
    return m.find() ? m.group(1) : "";
}

get_match("FOO[BAR]", "\\[(.*?)\\]")  // returns "BAR"

public static List<String> get_matches(String s, String p) {
    // returns all matches of p in s for first group in regular expression 
    List<String> matches = new ArrayList<String>();
    Matcher m = Pattern.compile(p).matcher(s);
    while(m.find()) {
        matches.add(m.group(1));
    }
    return matches;
}

get_matches("FOO[BAR] FOO[CAT]", "\\[(.*?)\\]")) // returns [BAR, CAT]


답변

사이 []에있는 것을 가져와야하는 경우 다음 \[([^\]]*)\]과 같이 사용할 수 있습니다 .

Pattern regex = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = regex.matcher(str);
if (m.find()) {
    result = m.group();
}

양식이 필요한 경우 identifier + [ + content + ]식별자가 영숫자 인 경우에만 컨텐츠 추출을 제한 할 수 있습니다.

[a-zA-Z][a-z-A-Z0-9_]*\s*\[([^\]]*)\]

이 같은 것을 확인한다 Foo [Bar], 또는 myDevice_123["input"]예를 들어 있습니다.

주요 의제

주요 문제는 다음과 같은 내용을 추출하려고 할 때입니다.

FOO[BAR[CAT[123]]+DOG[FOO]]

정규식이 작동하지 않습니다 및 반환 BAR[CAT[123하고 FOO.
정규식으로 변경하면 \[(.*)\]괜찮지 만 다음과 같이 더 복잡한 것에서 내용을 추출하려고하면 다음과 같습니다.

FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]

어떤 정규식도 작동하지 않습니다.

모든 경우에 적합한 컨텐츠를 추출하는 가장 정확한 Regex는 []쌍 을 균형을 잡고 컨텐츠를 제공 해야하기 때문에 훨씬 더 복잡 합니다.

더 간단한 솔루션

문제가 복잡해지고 []임의 의 내용이 복잡해지면 대신 []정규식보다 오래된 오래된 코드 선반을 사용하여 쌍의 균형을 잡고 문자열을 추출 할 수 있습니다 .

int i;
int brackets = 0;
string c;
result = "";
for (i = input.indexOf("["); i < str.length; i++) {
    c = str.substring(i, i + 1);
    if (c == '[') {
        brackets++;
    } else if (c == ']') {
        brackets--;
        if (brackets <= 0)
            break;
    }
    result = result + c;
}   

이것은 실제 코드보다 의사 코드입니다 .Java 코더가 아니므로 구문이 올바른지 모르겠지만 개선하기에 충분히 쉬워야합니다.
이 코드가 제대로 작동하고 []복잡한 내용을 추출 할 수있는 것은 무엇입니까?


답변

정규식은 다음과 같습니다.

/FOO\[(.+)\]/

FOO가 일정하다고 가정합니다.

그래서 이것을 자바로 넣으려면 :

Pattern p = Pattern.compile("FOO\\[(.+)\\]");
Matcher m = p.matcher(inputLine);


답변

String input = "FOO[BAR]";
String result = input.substring(input.indexOf("[")+1,input.lastIndexOf("]"));

첫 번째 ‘[‘와 마지막 ‘]’사이의 값을 반환합니다.

푸 [바] => 바

푸 [바 [테스트]] => 바 [테스트]

참고 : 입력 문자열이 제대로 구성되지 않은 경우 오류 검사를 추가해야합니다.