2009-06-26 33 views
12

Tôi phải thay thế \\ bằng \ bằng Java. Mã tôi đang sử dụng làTại sao tôi nhận được một StringIndexOutOfBoundsException khi tôi cố gắng thay thế `\` bằng ``?

System.out.println((MyConstants.LOCATION_PATH + File.separator + myObject.getStLocation()).replaceAll("\\\\", "\\")); 

Nhưng tôi không biết tại sao nó đang ném StringIndexOutOfBoundsException.

Nó nói String index out of range: 1

Điều gì có thể là lý do? Tôi đoán đó là vì đối số đầu tiên replaceAll chấp nhận một mẫu. Điều gì có thể là giải pháp khả thi?


stacktrace

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1 
    at java.lang.String.charAt(String.java:558) 
    at java.util.regex.Matcher.appendReplacement(Matcher.java:696) 
    at java.util.regex.Matcher.replaceAll(Matcher.java:806) 
    at java.lang.String.replaceAll(String.java:2000) 

trả lời Tìm thấy

asalamon74 gửi mã tôi cần, nhưng tôi không biết tại sao ông đã xóa nó. Trong mọi trường hợp ở đây nó được.

Có một bug đã được lưu trong cơ sở dữ liệu lỗi của Java. (Cảm ơn tham chiếu này, asalamon.)

yourString.replaceAll("\\\\", "\\\\"); 

Thật ngạc nhiên, cả chuỗi tìm kiếm và chuỗi thay thế đều giống nhau :) nhưng vẫn thực hiện những gì tôi yêu cầu.

+0

Ngoài ra, nó nên được File.separator isnt nó? – Tom

+0

Kết quả của việc nối các trường khác nhau mà bạn có là gì? – LB40

+0

@LB c: \\ myDoc \\ hell \ o.txt –

Trả lời

1

File.seperator đã được thoát như bất kỳ đối tượng chuỗi nào để bạn thoát chúng hai lần.

Bạn chỉ cần thoát khỏi các giá trị mà bạn đang nhập dưới dạng chuỗi ký tự.

17

Sử dụng String.replace thay vì replaceAll để tránh nó bằng cách sử dụng regex:

String original = MyConstants.LOCATION_PATH + File.seperator 
    + myObject.getStLocation(); 
System.out.println(original.replace("\\\\", "\\")); 

Cá nhân tôi sẽ không làm điều đó theo cách này mặc dù - Tôi muốn tạo MyConstants.LOCATION_PATH_FILE như một File và sau đó bạn có thể viết:

File location = new File(MyConstants.LOCATION_PATH_FILE, 
         myObject.getStLocation()); 

sẽ tự động làm điều đúng.

+0

Đó chỉ là một ví dụ. thực hiện việc này, tôi phải thay thế '\\' bằng '\' trong chuỗi "hello \\ !! \ là \\ that \ you \"! –

+4

Càng gần bạn có thể làm ví dụ của bạn thành hiện thực, bạn càng có nhiều khả năng nhận được câu trả lời hữu ích. Tuy nhiên, việc sử dụng chỉ "thay thế" vẫn hoạt động tốt. –

0

Tôi nghi ngờ vấn đề là replaceAll() sử dụng regexps và dấu gạch chéo ngược là một ký tự thoát trong regexps cũng như trong Java - có thể cần phải tăng gấp đôi số lượng dấu gạch chéo ngược.

Nói chung, bạn nên luôn đăng bài theo dõi ngăn xếp đầy đủ các ngoại lệ, sẽ dễ dàng hơn nhiều trong việc chẩn đoán vấn đề theo cách đó.

0

Tôi tin rằng những gì bạn cần làm là:

System.out.println((MyConstants.LOCATION_PATH + File.separator + myObject.getStLocation()).replaceAll("\\\\\\\\", "\\\\")); 

Khái niệm Chuỗi thường xuyên thực sự là bốn gạch chéo ngược, mà là một biểu thức chính quy phù hợp với hai dấu xồ nguợc.

Việc thay thế chuỗi phải có bốn dấu gạch chéo theo tài liệu Java, từ: http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#replaceAll(java.lang.String)

Lưu ý rằng những dấu xồ nguợc() và dấu hiệu đô la ($) trong chuỗi thay thế có thể gây ra kết quả là khác nhau hơn nếu nó được coi là chuỗi thay thế theo nghĩa đen. Ký hiệu đô la có thể được coi là tham chiếu đến các chuỗi đã ghi như được mô tả ở trên và các dấu gạch chéo ngược được sử dụng để thoát khỏi các ký tự chữ trong chuỗi thay thế.

8

Vâng, tôi đã cố gắng

String test = "just a \\ test with some \\\\ and others \\\\ or \\ so"; 
    String result = test.replaceAll("\\\\", "\\\\"); 
    System.out.println(test); 
    System.out.println(result); 
    System.out.println(test.equals(result)); 

và nhận được, như mong đợi

just a \ test with some \\ and others \\ or \ so 
just a \ test with some \\ and others \\ or \ so 
true 

gì bạn thực sự cần

string.replaceAll("\\\\\\\\", "\\\\"); 

để có được

just a \ test with some \\ and others \\ or \ so 
just a \ test with some \ and others \ or \ so 
false 

Bạn muốn tìm: \\ (2 dấu gạch chéo)
mà cần phải được thoát trong regex: \\\\ (4 dấu gạch chéo)
và trốn thoát trong Java: "\\\\\\\\" (8 dấu gạch chéo)
tương tự cho việc thay thế ...

-2
final StringBuilder result = new StringBuilder(); 
final StringCharacterIterator iterator = new StringCharacterIterator(str); 
char character = iterator.current(); 
while (character != CharacterIterator.DONE) 
{ 
    if (character == '\\\\') { 
    result.append("\\"); 
    } 
    else { 
    result.append(character); 
    } 

    character = iterator.next(); 
} 

System.out.print(result); 
+2

'if (character == '\\\\')' là một lỗi cú pháp. Bạn đang cố gắng ép hai dấu gạch chéo ngược vào một chữ 'char'. –

1

Hãy thử điều này

cadena.replaceAll("\\\\","\\\\\\\\") 
2

Đối với regex, nếu bạn muốn thay đổi \ để \\, bạn nên làm điều này:

if (str.indexOf('\\') > -1) 
    str = str.replaceAll("\\\\", "\\\\\\\\"); 
str = "\"" + str + "\""; 

đâu \\\\ nghĩa \\\\\\\\\ nghĩa \\.

1

Cách tốt nhất là:

str.replace(**'**\\**'**, **'**/**'**); //with char method not String 
Các vấn đề liên quan