다음과 같은 문자열이 있습니다.
http://schemas/identity/claims/usertype:External
그런 다음 내 목표는 해당 문자열을 콜론 구분 기호로 두 단어로 분할하는 것이지만 정규식이 작동하는 방식을 지정해야하는 경우 콜론을 분할하지만 "http : //"에 콜론을 포함하지 않으므로 해당 문자열은 다음으로 분할됩니다. :
http://schemas/identity/claims/usertype
External
다음과 같은 정규식을 시도했습니다.
(http:\/\/+schemas\/identity\/claims\/usertype)
따라서 다음과 같습니다.
http://schemas/identity/claims/usertype
:External
그런 다음 나머지 콜론을 빈 문자열로 바꿉니다.
하지만 정규식을 거의 사용하지 않았기 때문에 모범 사례가 아니라고 생각합니다. 정규식을 단순화하기위한 제안이 있습니까?
미리 감사드립니다
이것은 X / Y 문제입니다. 다행스럽게도 해결하려는 근본적인 문제 (즉, URL에서 문자열 가져 오기)를 설명하고 문제를 해결하기 위해 선택한 방향을 설명하여 (나쁜 , 아래 참조),이 솔루션에 대한 문제에 대해 질문합니다 (전체 솔루션이 나쁘기 때문에 관련성이 없음).
URL은 이와 같이 구문 분석 할 수 없습니다. 이런 식으로 쪼갤 수있는 끈으로 취급해서는 안됩니다. 예를 들어 서버 부분에는 콜론도 포함될 수 있습니다. 포트 번호 용. 서버 부분 앞에 콜론을 포함 할 수있는 인증이있을 수 있습니다. 물론 거의 사용되지 않습니다.
접근 방식의 문제점을 보여주는 다음을 시도하십시오.
https : // joe : [email protected] : 443 /
그 링크는 작동합니다. 어쨌든 포트 443이 기본값이었고 Google은 전송을 끝내는 인증 헤더를 무시하지만 요점은 URL에 이러한 항목이 포함될 수 있다는 것입니다.
하지만 rzwitserloot, 그건 .. 안돼! 알아!
그것은 나쁜 프로그래밍 사고 방식입니다. 이러한 사고 방식은 보안 문제로 이어집니다. 명시되지 않은 가정으로 코드베이스에 부담을주는 솔루션을 선택하는 이유는 무엇입니까 (가정 :이 코드에 대한 URL을 제공하는 장소는 내 통제하에 있으며 포트 또는 인증 헤더를 보내지 않을 것입니다)? 구성 파일에서 '서버'부분을 구성 할 수있는 경우 해당 구성 파일에 포트를 추가 할 수 없다고 언급 하시겠습니까? 지금부터 4 년을 기억 하시나요?
올바르게 수행하는 솔루션은 이러한 모든 언급되지 않은 (또는 언급 된 경우 매우 다루기 힘든) 가정으로 코드에 부담을주지 않을 것입니다.
먼저 해당 문자열을 java.net.URI
. 그런 다음 거기에있는 방법을 사용하여 실제로 원하는 것을 얻습니다 path
. 즉 당신이 떨어져 당길 수있는 문자열입니다 :
URI uri = new URI("http://schemas/identity/claims/usertype:External");
String path = uri.getPath();
String newPath = path.replaceAll(":.*", "");
String type = path.replaceAll(".*?:", "");
URI newUri = uri.resolve(newPath);
System.out.println(newUri);
System.out.println(type);
인쇄물:
http://schemas/identity/claims/usertype
External
NB : 거기에 포트 또는 인증 항목을 버리거나 상대 URL로 만드십시오. 원하는대로 수행하십시오.이 코드는 콜론을 계산하려는 시도보다 기본 URL을 변경하는면에서 훨씬 더 강력합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다