development

정규식을 사용하여 하위 문자열을 추출하는 방법

big-blog 2020. 3. 2. 13:09
반응형

정규식을 사용하여 하위 문자열을 추출하는 방법


두 개의 작은 따옴표가있는 문자열이 있습니다 '. 작은 따옴표 사이에는 내가 원하는 데이터가 있습니다.

다음 텍스트에서 "원하는 데이터"를 추출하기 위해 정규식을 작성하려면 어떻게해야합니까?

mydata = "some string with 'the data i want' inside";

작은 따옴표 사이에 부분을 원한다고 가정하면이 정규 표현식을 다음과 함께 사용하십시오 Matcher.

"'(.*?)'"

예:

String mydata = "some string with 'the data i want' inside";
Pattern pattern = Pattern.compile("'(.*?)'");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find())
{
    System.out.println(matcher.group(1));
}

결과:

내가 원하는 데이터

이를 위해 정규식이 필요하지 않습니다.

프로젝트에 Apache Commons lang을 추가 한 후 ( http://commons.apache.org/proper/commons-lang/ ) 다음을 사용하십시오.

String dataYouWant = StringUtils.substringBetween(mydata, "'");

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

public class Test {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile(".*'([^']*)'.*");
        String mydata = "some string with 'the data i want' inside";

        Matcher matcher = pattern.matcher(mydata);
        if(matcher.matches()) {
            System.out.println(matcher.group(1));
        }

    }
}

여러 인용 된 문자열을 쉽게 처리하는 정규 표현식이없는 솔루션 인 Scala를 선택했기 때문에 :

val text = "some string with 'the data i want' inside 'and even more data'"
text.split("'").zipWithIndex.filter(_._2 % 2 != 0).map(_._1)

res: Array[java.lang.String] = Array(the data i want, and even more data)

이것에 대한 간단한 하나의 라이너가 있습니다.

String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");

일치하는 그룹을 선택적으로 만들면이 경우 공백을 반환하여 찾을 수없는 따옴표도 제공합니다.

라이브 데모를 참조하십시오 .


자바 스크립트에서와 같이 :

mydata.match(/'([^']+)'/)[1]

실제 정규 표현식은 다음과 같습니다. /'([^']+)'/

욕심없는 수정자를 사용하면 (다른 게시물에 따라) 다음과 같습니다.

mydata.match(/'(.*?)'/)[1]

더 깨끗합니다.


String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");

스칼라에서

val ticks = "'([^']*)'".r

ticks findFirstIn mydata match {
    case Some(ticks(inside)) => println(inside)
    case _ => println("nothing")
}

for (ticks(inside) <- ticks findAllIn mydata) println(inside) // multiple matches

val Some(ticks(inside)) = ticks findFirstIn mydata // may throw exception

val ticks = ".*'([^']*)'.*".r    
val ticks(inside) = mydata // safe, shorter, only gets the first set of ticks

String dataIWant = mydata.split("'")[1];

라이브 데모 보기


Apache Commons Lang은 java.lang API를위한 다양한 도우미 유틸리티, 특히 문자열 조작 방법을 제공합니다. 귀하의 경우 시작 부분 문자열과 끝 부분 문자열이 동일하므로 다음 함수를 호출하십시오.

StringUtils.substringBetween(String str, String tag)

동일한 String의 두 인스턴스 사이에 중첩 된 String을 가져옵니다 .

시작 부분 문자열과 끝 부분 문자열이 다른 경우 다음 오버로드 된 메소드를 사용하십시오.

StringUtils.substringBetween(String str, String open, String close)

두 문자열 사이에 중첩 된 문자열을 가져옵니다.

일치하는 부분 문자열의 모든 인스턴스를 원하면

StringUtils.substringsBetween(String str, String open, String close)

시작 및 종료 태그로 구분 된 하위 문자열을 문자열에서 검색하여 배열에서 일치하는 모든 하위 문자열을 반환합니다 .

문제의 예는 일치하는 부분 문자열의 모든 인스턴스를 가져옵니다.

String[] results = StringUtils.substringsBetween(mydata, "'", "'");

참고 URL : https://stackoverflow.com/questions/4662215/how-to-extract-a-substring-using-regex



반응형