我有这个:
此输出的每一行都保存在List中,我想得到数字1570,40
我的正则表达式对于这种格式
看起来像这样 "([1-9][0-9]*[\\.|,][0-9]{2})[^\\.\\d](.*)"
"^([1-9][0-9]*[\\.|,][0-9]{2})$"
我有一个问题,如果最后一行是1570,40(通过第二个正则表达式),也是1570,40(最后一行是1570,40 *),但第一行没有成立..做你知道问题在哪里吗?
答案 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
。目前它令人困惑 - 它意味着相同,但看起来不同。