Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
346 views
in Technique[技术] by (71.8m points)

java - regex: How to escape backslashes and special characters?

Is there a way to escape ( or protect ) special characters in a regular expression?

What I would like to do is to create a simple regex tester:

import java.util.regex.*;
class TestRegex { 
   public static void main( String ... args ) { 
       System.out.printf("%s ~= %s ? %s  %n" , args[0], args[1], Pattern.matches( args[0], args[1] ) );
   }
}

Which works great to test my patterns before plug-in them into the program:

$java TestRegex "d" 1
d ~= 1 ? true  
$java TestRegex "d" 12
d ~= 12 ? false  
$java TestRegex "d+" 12
d+ ~= 12 ? true  
$java TestRegex "d+" a12
d+ ~= a12 ? false  
$java TestRegex "d+" ""
d+ ~=  ? false  

The next thing I do is to use this pattern in my program, but each time I have to manually escape it:

Pattern p = Pattern.compile( /*copy pasted regex here */ );

And in this sample, substitute: d with \d. After a while this becomes very irritating .

Q. How can I automatically escape these special characters?

Question&Answers:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You just need to replace all single backslashes with double backslashes. This is complicated a bit since the replaceAll function on String really executes a regular expression and you have to first escape the backslash because it's a literal (yielding \), and then escape it again because of the regular expression (yielding \\). The replacement suffers a similar fate and requires two such escape sequences making it a total of 8 backslashes:

System.out.printf("%s ~= %s ? %s  %n", 
    args[0].replaceAll("",""), args[1], ...

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...