나는이 "주, 국가"를 반환해야 생각하지만, "국가" 왜 내가 원하는 것 이상으로 욕심이없는 정규 표현식이 붙잡습니까?
System.out.println("city,state,country".replaceAll("(.*,)?", ""));
가 왜 이런 식으로 작동하고 반환, 그리고 어떻게 그것이 "주, 국가"를 반환해야합니까. 나는이 답을 정규식으로 원한다.
나는이 "주, 국가"를 반환해야 생각하지만, "국가" 왜 내가 원하는 것 이상으로 욕심이없는 정규 표현식이 붙잡습니까?
System.out.println("city,state,country".replaceAll("(.*,)?", ""));
가 왜 이런 식으로 작동하고 반환, 그리고 어떻게 그것이 "주, 국가"를 반환해야합니까. 나는이 답을 정규식으로 원한다.
으로 replaceAll
일치하는 모든 그룹을 대체
당신은
System.out.println("city,state,country".replaceAll("(.*?,)", ""));
하나뿐 아니라 쉼표로 끝나는 그룹을 캡처하고 있기 때문에 현재 작동하지 않습니다.
System.out.println("city,state,country".replaceAll("^[^,]*+,", ""));
? non-greedy 플래그는 컨텍스트 내에서 + 또는 * 뒤에 만 사용할 수 있으며 0 또는 1 일치입니다.
^(.*?,)
또는 그런
: 이름에서 알 수System.out.println("city,state,country".replaceAll("(.*?,)((?:.*?,)+)", "$2"));
이것은 도시, 상태를 없애 버릴 것입니다. 그는 국가, 국가를 유지하기를 원합니다. –
이 식을 시도합니다. 그룹이 어디에 매치되는지 좀 더 구체적으로 밝혀야합니다. 첫 번째 일치 그룹을 지정하려면 앵커로 String
^
의 시작을 지정할 수 있습니다
"city,state,country".replaceAll("^(.*?,)", "")
왜 당신이 downvoted인지 확실하지 않습니다. 나는이 대답에서 그룹 참조가 대체면에서 받아 들여지는 것을 배웠다. –
*
후 ?
를 추가 할 필요가 비 욕심 .*
을 만들고 싶어합니다.replaceAll
부품 일치하는 모든 항목을 대체 할 것이다, 그래서 당신은 아마가 System.out.println("city,state,country".replaceFirst(".*?,", ""));
출력하려고 replaceFirst
사용해야합니다
state,country
당신이 사용할 수없는 경우 replaceFirst
이고로 숙박해야합니다.다음 @Reimeus answer 아마 당신이 무엇을 찾고 있습니다.
replaceFirst가 사용 된 경우에만 작동하지만 그렇지 않은 경우 도시와 주를 삭제합니다. –
@ 0A0D 당신이하는 말을 잘 모르겠습니다. 더 설명해 주시겠습니까? – Pshemo
그러면'city, state, '와 일치하고 아무 것도 대체하지 않고 단지'country'를 제공합니다. 내 생각에 : http://regexr.com?34nck replaceAll을 사용하는 경우 –
+1 - 꺼려 진 한정자에 대한 대안으로 부정화 된 문자 클래스를 사용하는 것이 좋습니다. – Alex
@Alex와의 동의는 대답의 좋은 부분입니다. 더 멀리 나아가서 그것을 "사욕적"욕심쟁이 일치, 즉'^ [^,] * + '로 만들 수 있습니다. 이것은 역 추적이 절대로 필요하지 않음을 나타냅니다. –