Thomas Owens
Thomas Owens

Reputation: 116169

Why does this Java regex cause "illegal escape character" errors?

I'm working on a solution to a previous question, as best as I can, using regular expressions. My pattern is

"\d{4}\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}"

According to NetBeans, I have two illegal escape characters. I'm guessing it has to do with the \d and \w, but those are both valid in Java. Perhaps my syntax for a Java regular expression is off...

The entire line of code that is involved is:

userTimestampField = new FormattedTextField(
  new RegexFormatter(
    "\d{4}\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}"
));

Upvotes: 55

Views: 84621

Answers (7)

snaveware
snaveware

Reputation: 11

I had a similar because I was trying to escape characters such as -,*$ which are special characters in regular expressions but not in java.

Basically, I was developing a regular expression https://regex101.com/ and copy pasting it to java.

I finally realized that because java takes regex as string literals, the only characters that should be escaped are the special characters in java ie. \ and "

So in this case \\d should work. However, anyone having a similar problem like me in the future, only escaped double quotes and backslashes.

Upvotes: 1

Christopher Klewes
Christopher Klewes

Reputation: 11435

Have you tried this?

\\d{4}\\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}

Upvotes: 3

Daniel
Daniel

Reputation: 3374

all you need to do is to put

 *\
 ex: string ex = 'this is the character: *\\s';

before your invalid character and not 8 \ !!!!!

Upvotes: 0

butterchicken
butterchicken

Reputation: 13883

Assuming this regex is inside a Java String literal, you need to escape the backslashes for your \d and \w tags:

"\\d{4}\\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}"

This gets more, well, bonkers frankly, when you want to match backslashes:

public static void main(String[] args) {        
    Pattern p = Pattern.compile("\\\\\\\\"); //ERM, YEP: 8 OF THEM
    String s = "\\\\";
    Matcher m = p.matcher(s);
    System.out.println(s);
    System.out.println(m.matches());
}

\\ //JUST TO MATCH TWO SLASHES :(
true

Upvotes: 98

willcodejavaforfood
willcodejavaforfood

Reputation: 44063

Did you try "\\d" and "\\w"?

-edit- Lol I posted the right answer and get down voted and then I notice that stackoverflow escapes backslashes so my answer appeared wrong :)

Upvotes: 15

asalamon74
asalamon74

Reputation: 6170

What about the following: \\d{4}\\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}

Upvotes: 9

MystikSpiral
MystikSpiral

Reputation: 5028

I think you need to add the two escaped shortcuts into character classes. Try this: "[\d]{4}[\w]{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}"

--Good Luck.

Upvotes: -1

Related Questions