Java: how to parse double from regex

前端 未结 5 397
灰色年华
灰色年华 2020-12-03 10:41

I have a string that looks like \"A=1.23;B=2.345;C=3.567\"

I am only interested in \"C=3.567\"

what i have so far is:

     Matcher m = Patter         


        
相关标签:
5条回答
  • 2020-12-03 11:08

    if you need to validate decimal with dots, commas, positives and negatives:

    Object testObject = "-1.5";
    boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,][0-9]+$", (CharSequence) testObject);
    

    Good luck.

    0 讨论(0)
  • 2020-12-03 11:15

    if you want a regex for an input which might be double or just integer without any *.0 thing you can use this:
    Pattern.compile("(-?\d+\.?\d*)")

    0 讨论(0)
  • 2020-12-03 11:21

    I may be mistaken on this part, but the reason it's separating the two is because group() will only match the last-matched subsequence, which is whatever gets matched by each call to find(). Thanks, Mark Byers.

    For sure, though, you can solve this by placing the entire part you want inside a "capturing group", which is done by placing it in parentheses. This makes it so that you can group together matched parts of your regular expression into one substring. Your pattern would then look like:

    Pattern.compile("C=(\\d+\\.\\d+)")
    

    For the parsing 3567 or 3.567, your pattern would be C=(\\d+(\\.\\d+)?) with group 1 representing the whole number. Also, do note that since you specifically want to match a period, you want to escape your . (period) character so that it's not interpreted as the "any-character" token. For this input, though, it doesn't matter

    Then, to get your 3.567, you would you would call m.group(1) to grab the first (counting from 1) specified group. This would mean that your Double.parseDouble call would essentially become Double.parseDouble("3.567")

    As for taking C= out of your pattern, since I'm not that well-versed with RegExp, I might recommend that you split your input string on the semi-colons and then check to see if each of the splits contain the C; then you could apply the pattern (with the capturing groups) to get the 3.567 from your Matcher.

    Edit For the more general (and likely more useful!) cases in gawi's comment, please use the following (from http://www.regular-expressions.info/floatingpoint.html)

    Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")
    

    This has support for optional sign, either optional integer or optional decimal parts, and optional positive/negative exponents. Insert capturing groups where desired to pick out parts individually. The exponent as a whole is in its own group to make it, as a whole, optional.

    0 讨论(0)
  • 2020-12-03 11:25

    Your regular expression is only matching numeric characters. To also match the decimal point too you will need:

    Pattern.compile("\\d+\\.\\d+")
    

    The . is escaped because this would match any character when unescaped.

    Note: this will then only match numbers with a decimal point which is what you have in your example.

    0 讨论(0)
  • 2020-12-03 11:27

    To match any sequence of digits and dots you can change the regular expression to this:

    "(?<=C=)[.\\d]+"
    

    If you want to be certain that there is only a single dot you might want to try something like this:

    "(?<=C=)\\d+(?:\\.\\d+)?"
    

    You should also be aware that this pattern can match the 1.2 in ABC=1.2.3;. You should consider if you need to improve the regular expression to correctly handle this situation.

    0 讨论(0)
提交回复
热议问题