正则表达式获取 2 个数字,而不是紧跟 java 中的字符

Regex to get 2 digit-numbers not immediately preceded and followed by a character in java

我正在尝试在 Java 中编写一个正则表达式,它获取所有两位数(两位数不能以 0 开头)并且它前面和后面都不跟一个字符。

例如,我想匹配以下字符串中的数字 30:

但不想上以下:

我正在尝试使用环顾四周来完成此操作,到目前为止我最接近的是: (?<!\w)(1[2-9]|[2-9][0-9])(?!([\w]))

两位数不能以 0 开头,我不想在三位数字中匹配两位数。

下面的代码简单的测试了Wiktor在Java中的评论:

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestIt
{
    public static void main (String args[])
        throws Exception
    {
        String test1 = "character30 wordstart";
        String test2 = "wordstart 30character";
        String test3 = "the number 30 is here";

        String failTest = "character30character";

        String regex = "\b\d{2}|\d{2}\b";

        Pattern pat = Pattern.compile(regex);
        Matcher match = pat.matcher(test1);
        System.out.println("test1: " + match.find());
        match = pat.matcher(test2);
        System.out.println("test2: " + match.find());
        match = pat.matcher(test3);
        System.out.println("test3: " + match.find());
        match = pat.matcher(failTest);
        System.out.println("failTest: " + match.find());
    }
}

结果:

test1: true
test2: true
test3: true
failTest: false

您可以使用以下正则表达式:

(?<!\S)[1-9]\d(?!\d)|(?<!\d)[1-9]\d(?!\S)

在 Java 字符串文字中定义正则表达式模式时,请记住双反斜杠。

模式匹配:

  • (?<!\S) - 下一个数字前面必须有空格或字符串开头
  • [1-9]\d - 从 1 到 9 的数字,然后是任何一位数字
  • (?!\d) - 两位数字后面不能跟另一个数字
  • | - 或
  • (?<!\d) - 前面不能有数字...
  • [1-9]\d - 从 1 到 9 的数字,然后是任何一位数字
  • (?!\S) - 后面应跟一个空格或字符串结尾。