tags:

views:

819

answers:

5

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}"
));
A: 

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 :)

willcodejavaforfood
The way I see it, you got downvoted for not making effective use of SO's code-formatting capability. ;)
Alan Moore
A: 

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.

MystikSpiral
Same error - two illegal escape characters.
Thomas Owens
@MystikSpiral: `\d` and `\w` **are** character classes. They're *shorthands* (not "shortcuts") for the predefined character classes `[0-9]` and `[A-Za-z0-9_]` respectively. The brackets are redundant unless you're using them in combinations, like `[\d\s]` or `[\w,.!?]`.
Alan Moore
+4  A: 

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}

asalamon74
This gets rid of the error...let's see if it actually works as a regex.
Thomas Owens
It appears to be working. +1. However, I accepted butterchicken's answer because it's more in-depth. Thanks for your help, though.
Thomas Owens
+13  A: 

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
butterchicken
+1 This should be the problem.
Malax
+1  A: 

Did 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}
codedevour