0

I have a string with data separated by commas like this:

$d4kjvdf,78953626,10.0,103007,0,132103.8945F,

I tried the following regex but it doesn't match the strings I want:

[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,
dimo414
  • 42,340
  • 17
  • 131
  • 218

2 Answers2

2

The $ at the beginning of your data string is not matching the regex. Change the first character class to [$a-zA-Z0-9]. And a couple of the comma separated values contain a literal dot. [$.a-zA-Z0-9] would cover both cases. Also, it's probably a good idea to anchor the regex at the start and end by adding ^ and $ to the beginning and end of the regex respectively. How about this for the full regex:

^[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,$

Update:

You said number of commas is your primary matching criteria. If there should be 6 commas, this would work:

^([^,]+,){6}$

That means: match at least 1 character that is anything but a comma, followed by a comma. And perform the aforementioned match 6 times consecutively. Note: your data must end with a trailing comma as is consistent with your sample data.

Asaph
  • 147,774
  • 24
  • 184
  • 187
0

Well your regular expression is certainly jarbled - there are clearly characters (like $ and .) that your expression won't match, and you don't need to \\ escape ,s. Lets first describe our requirements, you seem to be saying a valid string is defined as:

A string consisting of 6 commas, with one or more characters before each one

We can represent that with the following pattern:

(?:[^,]+,){6}

This says match one or more non-commas, followed by a comma - [^,]+, - six times - {6}. The (?:...) notation is a non-capturing group, which lets us say match the whole sub-expression six times, without it, the {6} would only apply to the preceding character.


Alternately, we could use normal, capturing groups to let us select each individual section of the matching string:

([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),?

Now we can not only match the string, but extract its contents at the same time, e.g.:

String str = "$d4kjvdf,78953626,10.0,103007,0,132103.8945F,";
Pattern regex = Pattern.compile(
  "([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),?");
Matcher m = regex.matcher(str);

if(m.matches()) {
  for (int i = 1; i <= m.groupCount(); i++) {
    System.out.println(m.group(i));
  }
}

This prints:

$d4kjvdf
78953626
10.0
103007
0
132103.8945F
Community
  • 1
  • 1
dimo414
  • 42,340
  • 17
  • 131
  • 218