두 개의 작은 따옴표가있는 문자열 '
이 있습니다. 단일 인용 부호 사이에 내가 원하는 데이터가 있습니다.정규 표현식을 사용하여 부분 문자열을 추출하는 방법
다음 텍스트에서 "원하는 데이터"를 추출 할 수있는 정규식을 작성하려면 어떻게해야합니까? 자바 스크립트로
mydata = "some string with 'the data i want' inside";
두 개의 작은 따옴표가있는 문자열 '
이 있습니다. 단일 인용 부호 사이에 내가 원하는 데이터가 있습니다.정규 표현식을 사용하여 부분 문자열을 추출하는 방법
다음 텍스트에서 "원하는 데이터"를 추출 할 수있는 정규식을 작성하려면 어떻게해야합니까? 자바 스크립트로
mydata = "some string with 'the data i want' inside";
당신이 따옴표 사이의 부분을 원하는 가정하는 Matcher
와 정규 표현식을 사용 너도 쳤다 스칼라, 쉽게 여러 인용 문자열을 다루는 정규식없이 솔루션 : 스칼라에서
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)
:
mydata.match(/'([^']+)'/)[1]
실제 정규 표현식은 다음과 같습니다 /'([^']+)'/
당신은 (다른 포스트 당) 비 욕심 수정을 사용하여이 같이 있다면 :
mydata.match(/'(.*?)'/)[1]
깨끗합니다.
"'(.*?)'"
예 :
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));
}
결과 :
the data i want
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));
}
}
}
System.out.println (matcher.group (0)); <--- 0을 기준으로 한 인덱스 – nclord
그룹 (0)은 특별한 의미가 있습니다. 캡처 그룹은 인덱스 그룹 (1) 에서 시작합니다. 즉 그룹 (1)이 대답에 맞습니다. "그룹 캡처는 왼쪽에서 오른쪽으로 1부터 시작하며 그룹 0은 전체 패턴을 나타냅니다"- 소스 : https://docs.oracle.com/javase/8/docs/api/java/util/regex/ Matcher.html # group-int- – Apriori
그룹 (1)을 사용했지만 어떤 결과도 얻지 못했습니다 ... –
때문에
Clever. 그것을 사랑. –
사람들이 스칼라를 좋아하는 이유는 읽을만한 해결책입니다. – prayagupd
Java에서'.split ('\' '). get (2)'또는 그 정도까지는 어떨까요? 나는 그것이 당신이 그것이 읽을 수있는 해결책이라고 생각한다면 뇌 스캔을해야 할 필요가 있다고 생각합니다. 누군가가 나에게 코드 골프를하려고하는 것처럼 보입니다. – ArtOfWarfare
,
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
당신은 이것에 대한 정규식이 필요하지 않습니다.
프로젝트 (http://commons.apache.org/proper/commons-lang/)에 아파치 평민 랭을 추가 한 후 사용
는String dataYouWant = StringUtils.substringBetween(mydata, "'");
감사합니다 ..... 나는 정규식에 초보자입니다 ... 그래서 이것은 쉬운 방법이라고 생각합니다 .... –
아니, 당신은 정규식을 사용해야합니다. 이 간단한 기능을 위해 프로젝트에 큰 의존성을 추가하는 것은 끔찍한 일입니다. regex를 배워라, 당신은 당신의 경력에서 그것을 반복해서 사용할 것이다. – BadZen
소프트웨어 배포 방법을 고려해야합니다. 웹 스타트와 같은 것이라면 Apache 공통 기능을 추가하는 것이 현명한 방법이 아닙니다. 하지만 그렇지 않을 수도 있습니다. 게다가 아파치 공유에는 훨씬 더 많은 것이 있습니다. 정규 표현식을 아는 것이 좋을 때조차도 그것을 사용할 때주의해야합니다. Regex는 읽기, 쓰기 및 디버그가 정말 어려울 수 있습니다. 주어진 상황을 감안할 때 이것이 더 나은 해결책이 될 수 있습니다. – Beothorn
이것에 대한 간단한 한 줄있다 : 일치하는 그룹을 선택함으로써
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
,이 또한 이 경우 공백을 돌려서 인용문을 찾을 수 없습니다.
live demo을 참조하십시오.
String dataIWant = mydata.split("'")[1];
빌어 먹을 ... 난 항상 비 욕심 수정 :( –
교체에 대해 잊지 참조와 "만약"는 예상 할 때 "동안"하나 개 이상의 발행 수 – OneWorld
마음 이 코드 샘플이 작동하려면 matcher.find()가 필요합니다.이 메서드를 호출하지 않으면 matcher.group (1)이 호출 될 때 "일치하는 항목이 없습니다"예외가 발생합니다. – rexford