【问题标题】:Find the first occurrence with Regex and Java使用 Regex 和 Java 查找第一个匹配项
【发布时间】:2016-03-27 07:43:55
【问题描述】:

我希望能够找到 m² 的第一次出现,然后是它前面的数字,可以是整数或十进制数。 例如

“一些文字”38 m²“一些文字”,

“一些文字”48,8 m²“一些文字”,

“一些文字”48 m²“一些文字”等。

到目前为止我所拥有的是:

\d\d,\d\s*(\m\u00B2)|\d\d\s*(\m\u00B2)

现在可以找到所有出现的情况,尽管我想它可以用findFirst() 修复。任何想法如何改进正则表达式部分?

【问题讨论】:

标签: java regex


【解决方案1】:

要获得第一个匹配项,您只需在 if 块内使用 Matcher#find()

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.

【讨论】:

  • 建议:在数字周围添加捕获组,以便使用group(1)提取并使用DecimalFormat解析。
  • 可以,可以在数字周围设置一个捕获组,只是OP原始模式没有那个组。
【解决方案2】:

这是我想给你的帮助:)(正在进行中,稍后它应该返回 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;
    }

【讨论】:

    【解决方案3】:

    一种简单的方法!

    description.replaceFirst(@NotNull String regex,
                               @NotNull String replacement)
    

    JAVADoc:用给定的替换替换此字符串中与给定正则表达式匹配的第一个子字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2020-06-16
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多