This is more a question of understanding than an actual problem. The situation explains as follows. I got some float numbers (e.g. an amount of money) between two quotation
You are correct,
(?<=\"[0-9]|\"[0-9]{2}|\"[0-9]{3})(,)(?=[0-9]{2}\")
should be the right regex in this case.
\"
for two and three digits" - you actually need it.
(?<=\"[0-9]|[0-9]{2}|[0-9]{3})(,)(?=[0-9]{2}\")
Will match 12,23"
and 123,23"
as well.
|
. Meaning (?<=\"[0-9]|\"[0-9]{2}|\"[0-9]{3})
will fail, because the alternatives are not of the same size - 2, 3, 4.
This is because Sublime seems to be using the Boost library regexes. There it is stated:
Lookbehind
(?<=pattern)
consumes zero characters, only if pattern could be matched against the characters preceding the current position (pattern must be of fixed length).
(?<!pattern)
consumes zero characters, only if pattern could not be matched against the characters preceding the current position (pattern must be of fixed length).
An alternative is to separate the lookbehinds:
(?:(?<=\"[0-9])|(?<=\"[0-9]{2})|(?<=\"[0-9]{3}))(,)(?=[0-9]{2}\")
There is a cool trick which is present in some regex engines (including Perl's, Ruby's and Sublime's) - \K
. What \K
roughly translates to is "drop all that was matched so far". Therefore, you can match any ,
within a float number surrounded by quotation marks with:
"\d+\K,(?=\d+")
See it in action