29

How do you replace all of the characters in a string that do not fit a criteria. I'm having trouble specifically with the NOT operator.

Specifically, I'm trying to remove all characters that are not a digit, I've tried this so far:

String number = "703-463-9281";
String number2 = number.replaceAll("[0-9]!", ""); // produces: "703-463-9281" (no change)
String number3 = number.replaceAll("[0-9]", "");  // produces: "--" 
String number4 = number.replaceAll("![0-9]", ""); // produces: "703-463-9281" (no change)
String number6 = number.replaceAll("^[0-9]", ""); // produces: "03-463-9281"
polygenelubricants
  • 376,812
  • 128
  • 561
  • 623
Chris Dutrow
  • 48,402
  • 65
  • 188
  • 258

2 Answers2

51

To explain: The ^ at the start of a character class will negate that class But it has to be inside the class for that to work. The same character outside a character class is the anchor for start of string/line instead.

You can try this instead:

"[^0-9]"
Rathma
  • 1,196
  • 2
  • 33
  • 65
tangens
  • 39,095
  • 19
  • 120
  • 139
  • 10
    To explain: The `^` at the start of a *character class* will negate that class But it has to be inside the class for that to work. The same character outside a character class is the anchor for start of string/line instead. – Joey Oct 02 '10 at 20:01
27

Here's a quick cheat sheet of character class definition and how it interacts with some regex meta characters.

  • [aeiou] - matches exactly one lowercase vowel
  • [^aeiou] - matches a character that ISN'T a lowercase vowel (negated character class)
  • ^[aeiou] - matches a lowercase vowel anchored at the beginning of the line
  • [^^] - matches a character that isn't a caret/'^'
  • ^[^^] - matches a character that isn't a caret at the beginning of line
  • ^[^.]. - matches anything but a literal period, followed by "any" character, at the beginning of line
  • [a-z] - matches exactly one character within the range of 'a' to 'z' (i.e. all lowercase letters)
  • [az-] - matches either an 'a', a 'z', or a '-' (literal dash)
  • [.*]* - matches a contiguous sequence (possibly empty) of dots and asterisks
  • [aeiou]{3} - matches 3 consecutive lowercase vowels (all not necessarily the same vowel)
  • \[aeiou\] - matches the string "[aeiou]"

References

Related questions

Community
  • 1
  • 1
polygenelubricants
  • 376,812
  • 128
  • 561
  • 623