Làm thế nào để sử dụng phương thức `string.startsWith ()` bỏ qua trường hợp?


115

Tôi muốn sử dụng string.startsWith()phương pháp nhưng bỏ qua trường hợp.

Giả sử tôi có String"Session" và tôi sử dụng startsWithtrên "sEsSi" thì nó sẽ trả về true.

Làm thế nào tôi có thể đạt được điều này?


5
Không có lý do gì để đóng câu hỏi này. Dù sao, giải pháp tốt nhất là sử dụng string.regionMatches(true, 0, prefix, 0, prefix.length());mà không phải chịu chi phí "bình thường hóa" cả hai chuỗi.
isapir

@AlexanderAbakumov Tốt bởi tôi. Câu trả lời chính xác được đăng trong bình luận của tôi ở trên. Nó hiệu quả hơn nhiều so với việc thay đổi trường hợp của chuỗi. Sẽ rất tốt nếu bạn nâng cấp nó thành một câu trả lời hơn là một bình luận.
isapir

Câu trả lời:


98

Sử dụng toUpperCase()hoặc toLowerCase()để chuẩn hóa chuỗi của bạn trước khi kiểm tra nó.


8
Vấn đề lớn ở đây là hiệu suất. Đối với các Chuỗi nhỏ thì không vấn đề gì, nhưng nếu bạn có một chuỗi lớn ... Ý tôi là ... Bạn có thực sự sẽ thực hiện một toUpperCase trong một Chuỗi 1mb chỉ để so sánh 4-10 ký tự hình tượng không?
Dyorgio

4
Hum ngay cả khi tôi không thể hiểu tại sao tôi muốn so sánh các phần bắt đầu của một chuỗi 1mb sau đó nếu chỉ 4-10 ban đầu quan tâm đến nhân vật tôi tôi sử dụng substring và sau đó bình thường hóa và thực hiện ...
Nemesis

3
Câu trả lời này (và tất cả các câu trả lời khác được tìm thấy ở đây) đều sai. Nếu bạn xem xét việc triển khai, String.equalsIgnoreCase()bạn sẽ phát hiện ra rằng bạn cần phải so sánh cả phiên bản viết thường và viết hoa của Chuỗi trước khi bạn có thể trả về một cách chắc chắn false. Xem stackoverflow.com/a/38947571/14731 để có câu trả lời thay thế.
Gili

10
Câu trả lời này không đúng vì toLowerCase () sử dụng Locale.getDefault () bên trong để thay đổi ký tự và điều đó có thể dẫn đến phủ định sai. Giả sử bạn muốn so sánh "İstanbul" với "istanbul". Trong tiếng Thổ Nhĩ Kỳ, chữ thường của "İ" tương đương là "ı". Vì vậy, khi tôi cố gắng làm điều đó "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(trong môi trường Locale.Turkish), nó sẽ cho tôi sai.
Mustafa Berkay Mutlu

1
@Nemesis, Câu trả lời này sai, vì nó là câu trả lời được chấp nhận có thể gây hiểu lầm cho rất nhiều người. Bạn vui lòng chỉnh sửa câu trả lời của mình và liên kết đến câu trả lời của Rohit Jain.
Moha con lạc đà toàn năng vào

88

Một tùy chọn là chuyển đổi cả hai thành chữ thường hoặc chữ hoa:

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

Cái này sai. Xem: https://stackoverflow.com/a/15518878/14731


Một tùy chọn khác là sử dụng String#regionMatches()phương thức, phương thức này nhận đối số boolean cho biết có thực hiện đối sánh phân biệt chữ hoa chữ thường hay không. Bạn có thể sử dụng nó như thế này:

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

Nó kiểm tra xem vùng needletừ chỉ mục 0đến độ dài 5có xuất hiện trong haystackbắt đầu từ chỉ mục 0đến độ dài 5hay không. Đối số đầu tiên là true, có nghĩa là nó sẽ thực hiện đối sánh không phân biệt chữ hoa chữ thường.


Và chỉ cần bạn là một fan hâm mộ lớn của Regex , bạn có thể làm những điều như sau:

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

(?i) cờ nhúng là để bỏ qua đối sánh chữ hoa và chữ thường.


1
Trên thực tế, giả sử có một bảng có hơn 1 vạn mục nhập và tôi sử dụng vòng lặp for trên cột cụ thể để phân tích cú pháp tất cả các mục nhập đó và trong đó, tôi cố gắng sử dụng tùy chọn chữ thường này ở trên để tìm kiếm mục nhập bắt đầu bằng mẫu cụ thể . Vì vậy, điều này gây ra sự cố về hiệu suất. Nếu không tìm thấy kết quả phù hợp nào, thì bên trong nó sẽ phân tích cú pháp qua tất cả các mục nhập, điều này sẽ mất rất nhiều thời gian, vì đồng thời nó cũng được chuyển đổi thành chữ thường. Vì vậy, có bất kỳ tùy chọn nào khác, để giải quyết vấn đề hiệu suất?
Sheetal Bhatewara

@Rohit Jain, thực ra đây: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));không phải là một giải pháp chuyên nghiệp. Bạn có thể thử cách này: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));với các đối số vm -Duser.country=TR -Duser.language=tr Trong ví dụ Inày là chữ hoai
DPM



1

Tôi biết mình đến muộn, nhưng còn việc sử dụng StringUtils.startsWithIgnoreCase () từ Apache Commons Lang 3 thì sao?

Thí dụ :

StringUtils.startsWithIgnoreCase(string, "start");

Chỉ cần thêm phần phụ thuộc sau vào tệp pom.xml của bạn (lấy giả thuyết rằng bạn sử dụng Maven):

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

0

Bạn có thể dùng someString.toUpperCase().startsWith(someOtherString.toUpperCase())


-1

Bạn luôn có thể làm

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

-1

sử dụng bắt đầu với và toLowerCase cùng nhau

như thế này

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.