Java - 获取数字格式的正则表达式

时间:2013-04-23 11:41:46

标签: java regex string

我有这个:

  • 110121 NATURAL 95 1570,40
  • 110121 NATURAL 95 1570,40 *
  • 41,110 1 x 38,20 CZK)[A] *
  • '31,831 261,791 1308,61)
  • > 01572 PRAVO SO 17,00
  • 1,000 ks x 17,00
  • 1570,40

此输出的每一行都保存在List中,我想得到数字1570,40

我的正则表达式对于这种格式

看起来像这样
    "([1-9][0-9]*[\\.|,][0-9]{2})[^\\.\\d](.*)"
    "^([1-9][0-9]*[\\.|,][0-9]{2})$"

我有一个问题,如果最后一行是1570,40(通过第二个正则表达式),也是1570,40(最后一行是1570,40 *),但第一行没有成立..做你知道问题在哪里吗?

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解您的需求,但我认为您可以使用以下字词边界:

\b([1-9]\d*[.,]\d{2})\b

为了不匹配日期,您可以使用:

(?:^|[^.,\d])(\d+[,.]\d\d)(?:[^.,\d]|$)

<强>解释

The regular expression:

(?-imsx:(?:^|[^.,\d])(\d+[,.]\d\d)(?:[^.,\d]|$))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    ^                        the beginning of the string
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    [^.,\d]                  any character except: '.', ',', digits
                             (0-9)
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
    [,.]                     any character of: ',', '.'
----------------------------------------------------------------------
    \d                       digits (0-9)
----------------------------------------------------------------------
    \d                       digits (0-9)
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    [^.,\d]                  any character except: '.', ',', digits
                             (0-9)
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

答案 1 :(得分:0)

试试这个:

String s = "41,110 1 x 38,20 CZK)[A] * ";
Matcher m = Pattern.compile("\\d+,\\d+").matcher(s);
while(m.find()) {
    System.out.println(m.group());
}

答案 2 :(得分:0)

"([1-9][0-9]*[\\.|,][0-9]{2})[^\\.\\d](.*)"[^\\.\\d],这意味着它需要在数字后面有一个非数字的非点符号。第二行有*与之匹配。第一行在行尾有数字,所以没有匹配。我认为你只需要一个可以捕获所有数字的正则表达式:[^.\\d]*([1-9][0-9]*[.,][0-9]{2})[^.\\d]*。此外,您应该使用find而不是match来查找字符串中的任何子字符串,而不是匹配整个字符串。此外,如果一条线路中有两个这样的数字,也许有找到所有匹配的意义,不确定是否适合你。

另外,请使用[0-9]\d。目前它令人困惑 - 它意味着相同,但看起来不同。