6

我有这个:

  • 110121 自然色 95 1570,40
  • 110121 自然色 95 1570,40*
  • 41,110 1 x 38,20 捷克克朗)[A] *
  • ' 31,831 261,791 1308,61)
  • >01572 普拉沃 SO 17,00
  • 1,000 千秒 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* 开始),但第一行没有成立..你知道在哪里是问题吗?

4

3 回答 3

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
----------------------------------------------------------------------
于 2013-04-23T11:56:15.977 回答
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());
}
于 2013-04-23T11:54:52.377 回答
0

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

此外,使用[0-9]\d。目前它令人困惑 - 它的含义相同,但看起来不同。

于 2013-04-23T11:56:35.077 回答