我希望能够找到第一个出现的m²,然后是前面的数字,可以是整数或十进制数。 例如
“some text”38m²“some text”,
“some text”48,8m²“some text”,
“some text”48m²“some text”等。
到目前为止我所拥有的是:
\d\d,\d\s*(\m\u00B2)|\d\d\s*(\m\u00B2)
现在可以找到所有出现的内容,但我想可以用findFirst()
修复。有关如何改进Regex部分的任何想法吗?
答案 0 :(得分:5)
要获得第一场比赛,您只需在Matcher#find()
区块内使用if
:
String rx = "\\d+(?:,\\d+)?\\s*m\\u00B2";
Pattern p = Pattern.compile(rx);
Matcher matcher = p.matcher("E.g. : 4668,68 m² some text, some text 48 m² etc");
if (matcher.find()){
System.out.println(matcher.group());
}
请参阅IDEONE demo
请注意,您可以使用可选的非捕获组(?:..)?
删除备用组
模式分解:
\d+
- 1+位数(?:,\d+)?
- 0+逗号序列,后跟1+位数\s*
- 0+空白符号m\u00B2
- m2。答案 1 :(得分:1)
这就是我提出的帮助:)(正在进行中,以后它应该返回BigDecimal值),现在它似乎工作:
public static String findArea(String description) {
String tempString = "";
Pattern p = Pattern.compile("\\d+(?:,\\d+)?\\s*m\\u00B2");
Matcher m = p.matcher(description);
if(m.find()) {
tempString = m.group();
}
//remove the m and /u00B2 to parse it to BigDecimal later
tempString = tempString.replaceAll("[^0-9|,]","");
System.out.println(tempString);
return tempString;
}
答案 2 :(得分:1)
一种简单的方法!
description.replaceFirst(@NotNull String regex,
@NotNull String replacement)
JAVADoc:用给定的替换项替换与给定的正则表达式匹配的该字符串的第一个子字符串。