【问题标题】:Java/RegEx - How to find the first non-word number in a string?Java/RegEx - 如何在字符串中找到第一个非单词数字?
【发布时间】:2021-11-08 06:32:59
【问题描述】:

我想要一个基于此规则匹配的正则表达式:搜索字符串中的第一个数字并检查它是否单独在其附近(数字前后的字符是 SPACE,或者之前的字符是 SPACE,它是字符串的结尾部分)。

以下几个例子:

  • ABC AB34.1 ABC 39.25 AB : 39.25
  • ABC AB34.1 ABC 39.25 : 39.25
  • ABC 34.1AB ABC 39.25 : 39.25

我知道/^[^\d]*(\d+)/ 可以匹配字符串中的第一个数字,但我不知道如何检查它是否在其前后包含空格,或者在其之前和之后是否包含空格。

提前致谢。

【问题讨论】:

  • 你可以使用\b(?<!\d\.)\d+(?:\.\d+)?,见the demo。在 Java 中,您将需要 if (matcher.find()) { 并获得 matcher.group()
  • 非常感谢,但是第一个呢?您编写的这个示例将匹配一个数字,如果它位于字符串的开头,无论它是否附加到一个字母。如果它是第一个,我们可以做些什么来完全忽略它吗?我知道我可以在 java 中检查索引,但我想知道在 RegEx 中是否可以。 @Wiktor Stribiżew
  • 39.25 不在ABC AB34.1 ABC 39.25 AB : 39.25 的开头。您不是要求从字符串中提取第一个独立的浮点值吗?还是你想要^(?:.*?(\d+(?:\.\d+)?)){2} (demo)
  • @WiktorStribiżew 谢谢。第一个效果很好,但是我有一个问题。我想要与第一个完全相同的东西(找到第一个独立的浮点值),但如果它位于字符串的开头,则忽略它。

标签: java android regex


【解决方案1】:

你可以使用

(?!^)\b(?<!\d\.)\d+(?:\.\d+)?
(?!\A)\b(?<!\d\.)\d+(?:\.\d+)?

请参阅regex demo。在 Java 中,初始化 Matcher 对象后,在 if 块(不是 while)内执行它以获得第一个匹配项。

图案细节

  • (?!^) - 不在字符串的开头(\A 是一个明确的字符串起始锚点)
  • \b - 字边界
  • (?&lt;!\d\.) - 一个否定的后视,匹配一个不紧跟在数字前面的位置和.
  • \d+(?:\.\d+)? - 消费模式部分匹配一个或多个数字,然后是可选的. 序列和一个或多个数字。

请参阅regex demo

Java demo

String s = "34.1 ABC AB34.1 ABC 39.25 AB : 19.15";
Pattern pattern = Pattern.compile("(?!^)\\b(?<!\\d\\.)\\d+(?:\\.\\d+)?");
Matcher matcher = pattern.matcher(s);
if (matcher.find()){
    System.out.println(matcher.group()); 
} else {
    System.out.println("No match found in '" + s + "'!"); 
}
// => 39.25

【讨论】:

    【解决方案2】:

    [^\d]+[\s]+([\d]+[.]+[\d]+)[\s]+

    在英语中,基本上这个字符串检查是否

    • 一个或零个非数字
    • 一个或零个空格
    • 位数(可能有一位小数)
    • 一个或零个空格。

    https://regex101.com/r/0DQvDd/1

    【讨论】:

    • 谢谢,但这也匹配字母。例如,如果是“abc efg 55.3 1h23”,则匹配 efg 55.3。还是我错了?
    • 这仅匹配 55.3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2021-01-22
    • 2015-05-14
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多