대소 문자를 무시하고`string.startsWith ()`메서드를 사용하는 방법은 무엇입니까?


115

string.startsWith()방법 을 사용하고 싶지만 케이스를 무시합니다.

String"Session"이 있고 startsWith"sEsSi"에서 사용 한다고 가정 하면 true.

이것을 어떻게 할 수 있습니까?


5
이 질문을 닫을 이유가 없었습니다. 어쨌든, 가장 좋은 해결책은 string.regionMatches(true, 0, prefix, 0, prefix.length());두 문자열을 "정규화"하는 비용이 발생하지 않는 사용 하는 것입니다.
isapir

@AlexanderAbakumov 괜찮아요. 위의 댓글에 정답이 게시되어 있습니다. 문자열의 대소 문자를 변경하는 것보다 훨씬 효율적입니다. 댓글보다는 답변으로 업그레이드하는 것이 좋습니다.
isapir 2010 년

답변:


98

테스트하기 전에 toUpperCase()또는 toLowerCase()을 사용 하여 문자열을 표준화하십시오.


8
여기서 큰 문제는 성능입니다. 작은 문자열의 경우 문제가 없지만 큰 문자열이 있으면 ... 내 말은 ... 4-10 개의 초기 문자를 비교하기 위해 1MB 문자열에서 toUpperCase를 수행 하시겠습니까?
Dyorgio

4
흠 내가 왜 1mb 문자열의 시작 부분을 비교하고 싶은지 알 수 없더라도 4-10 개의 초기 문자 만 관심이 있다면 부분 문자열을 사용하고 정규화하고 완료했습니다 ...
Nemesis

3
이 답변 (및 여기에있는 다른 모든 답변)은 잘못되었습니다. 구현을 살펴보면 결정적으로 반환하기 전에 문자열의 소문자 및 대문자 버전을 모두String.equalsIgnoreCase() 비교해야한다는 것을 알게 될 것 입니다. 다른 답변 은 stackoverflow.com/a/38947571/14731 을 참조하십시오 . false
Gili

10
toLowerCase ()는 내부적으로 Locale.getDefault ()를 사용하여 문자를 변경하고 거짓 부정으로 이어질 수 있기 때문에이 대답은 사실이 아닙니다. "이스탄불"과 "이스탄불"을 비교한다고 가정 해 보겠습니다. 터키어 "İ"의 소문자는 "ı"입니다. 그래서 "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(Locale.Turkish 환경에서) 그렇게하려고하면 거짓이 될 것입니다.
Mustafa Berkay Mutlu

1
@Nemesis,이 대답은 잘못된 것입니다. 받아 들여지는 대답은 많은 사람들에게 오해의 소지가 있습니다. 답변을 수정하고 Rohit Jain 답변에 연결해 주시겠습니까?
전능하신 낙타 Moha

88

한 가지 옵션은 둘 다 소문자 또는 대문자로 변환하는 것입니다.

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());

이것은 잘못되었습니다. 참조 : https://stackoverflow.com/a/15518878/14731


또 다른 옵션은 String#regionMatches()대소 문자 구분 일치를 수행할지 여부를 나타내는 부울 인수 를 사용하는 메소드 를 사용 하는 것입니다. 다음과 같이 사용할 수 있습니다.

String haystack = "Session";
String needle = "sEsSi";
System.out.println(haystack.regionMatches(true, 0, needle, 0, 5));  // true

이 영역의 여부를 확인 needle지수 행 0까지의 길이 5에 존재하는 haystack인덱스에서 시작하는 0길이까지 5의 여부. 첫 번째 인수는 true대소 문자를 구분하지 않는 일치를 수행함을 의미합니다.


그리고 Regex 의 열렬한 팬이라면 다음과 같이 할 수 있습니다.

System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));

(?i) 포함 된 플래그는 대소 문자 일치 무시를위한 것입니다.


1
실제로 1 개 이상의 lakh 항목이있는 테이블이 있고 특정 열에서 for 루프를 사용하여 해당 항목을 모두 구문 분석하고 위의이 소문자 옵션을 사용하여 특정 패턴으로 시작하는 항목을 검색한다고 가정합니다. . 따라서 성능 문제가 발생합니다. 일치하는 항목이 전혀 없으면 내부적으로 모든 항목을 구문 분석하므로 많은 시간이 걸리며 동시에 소문자로도 변환됩니다. 그렇다면 성능 문제를 해결하기위한 다른 옵션이 있습니까?
Sheetal Bhatewara

@Rohit Jain, 실제로 이것은 System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));적절한 솔루션이 아닙니다. 다음을 시도해 볼 수 있습니다. System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));vm 인수이 -Duser.country=TR -Duser.language=tr 예에서는 I대문자입니다i
DPM



1

늦었다는 것을 알고 있지만 Apache Commons Lang 3에서 StringUtils.startsWithIgnoreCase ()를 사용하는 것은 어떻습니까?

예 :

StringUtils.startsWithIgnoreCase(string, "start");

pom.xml 파일에 다음 종속성을 추가하기 만하면됩니다 (Maven을 사용한다는 가설을 따름).

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>


-1

당신은 항상 할 수 있습니다

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());

-1

start with 및 toLowerCase 함께 사용

이렇게

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.