Skip to main content

How many backslashes?


In the previous Question: Which replace function works with regex?, We compare the different replace methods in the String class. Here we will focus on replacing backslashes inside a String.

The path in Windows uses the backslashes between folder names.  For example, the path of my java source is "c:\dev\app\source".  Since backslash is a special character in Java String, if we want to put this path inside a Java String literal, we need to escape the backslashes, it will be

     String a1 = "c:\\dev\\app\\source";

      System.out.println(a1);  // the output is “c:\dev\app\source”.

Now we want to change all the single backslashes to double backslashes, one may think this would work:

            String b1 = a1.replaceAll("\\", "\\\\");

But instead you will get Runtime Exception:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1

\

 ^

Note the definition of the replaceAll() method in the String class is:

public String replaceAll(String regex, String replacement)

   This method "replaces each substring of this string that matches the given regular expression with the given replacement."

We are dealing with regular expression pattern in Java String literal here.

For a backslash \
The pattern to match that would be \\
The String literal to create that pattern would have to have one backslash to escape each of the two backslashes: \\\\

Yes, four backslashes are for one!

So the correct way to do use the replaceAll() method to double up the backslashes are:

            String c1 = a1.replaceAll(“\\\\”, “\\\\\\\\”);   //output is “c:\\dev\\app\\source”

If you want to avoid the complex of  regex String literals, there is another option, use the replace method in the String class:

public String replace(char oldChar, char newChar)
   This method "returns a new string resulting from replacing all occurrences of oldChar in this string with newChar."

This method deals with the chars, not regex, so:

            String d1 = a1.replace(“\\”, “\\\\”);   // is “c:\\dev\\app\\source”

Put all these together:

Public class Test {
     public static void main (String … argv) {

       String a1 = "c:\\dev\\app\\";

      System.out.println(a1);  // the output is “c:\dev\app\source”.

       //String b1 = a1.replaceAll("\\", "\\\\");  //runtime exception

     String c1 = a1.replaceAll(“\\\\”, “\\\\\\\\”);

     System.out.println(c1); // is “c:\\dev\\app\\source”  

     String d1 = a1.replace(“\\”, “\\\\”);

     System.out.println(d1); // is “c:\\dev\\app\\source”

     }

}


Did you like the above article? Please share with your friends..

Comments

Popular posts from this blog

Java Health Center - Overview and Features

This video highlights the features available in Health Center. Health Center is a low-processor and memory usage diagnostic tool for monitoring the status of a running IBM Java Virtual Machine (JVM). Health Center provides live information and recommendations in each of the following areas: - Classes: information about classes being loaded - Environment: details of the configuration and system of the monitored application - Garbage Collection: information about the Java heap and pause times - Locking: information about contention on inflated locks - Profiling: sampling profile of Java methods including call paths

WebSphere MQ Interview Questions

What is MQ and what does it do? Ans. MQ stands for MESSAGE QUEUEING. WebSphere MQ allows application programs to use message queuing to participate in message-driven processing. Application programs can communicate across different platforms by using the appropriate message queuing software products. What is Message driven process? Ans . When messages arrive on a queue, they can automatically start an application using triggering. If necessary, the applications can be stopped when the message (or messages) have been processed. What are advantages of the MQ? Ans. 1. Integration. 2. Asynchrony 3. Assured Delivery 4. Scalability. How does it support the Integration? Ans. Because the MQ is independent of the Operating System you use i.e. it may be Windows, Solaris,AIX.It is independent of the protocol (i.e. TCP/IP, LU6.2, SNA, NetBIOS, UDP).It is not required that both the sender and receiver should be running on the same platform What is Asynchrony? Ans. With messag...

Java Garbage Collection

Explain Garbage collection mechanism in Java? Garbage collection is one of the most important features of Java. The purpose of garbage collection is to identify and discard objects that are no longer needed by a program so that their resources can be reclaimed and reused. A Java object is subject to garbage collection when it becomes unreachable to the program in which it is used. Garbage collection is also called automatic memory management as JVM automatically removes the unused variables/objects (value is null) from the memory. Every class inherits finalize() method from java.lang.Object, the finalize() method is called by garbage collector when it determines no more references to the object exists. In Java, it is good idea to explicitly assign null into a variable when no more in use. In Java on calling System.gc() and Runtime.gc(), JVM tries to recycle the unused objects, but there is no guarantee when all the objects will garbage collected. Garbage collection is an automatic pro...