正则表达式获取2位数字不会立即在java之前和之后跟一个字符

时间:2017-02-22 21:25:24

标签: java regex regex-lookarounds

我正在尝试用Java编写一个带有所有两位数字的正则表达式(两位数字不能以0开头)并且前面跟着一个字符。

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

  • character30 wordstart
  • wordstart 30character
  • 数字30在这里

但不想在以下方面:

  • character30character
  • 3000

我正在尝试使用环顾四周来实现这一点,而我到目前为止最接近的是: (?<!\w)(1[2-9]|[2-9][0-9])(?!([\w]))

两位数字不能以0开头,我不想匹配三位数字内的2位数字。

2 个答案:

答案 0 :(得分:2)

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

(?<!\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) - 应该跟一个空格或字符串结尾。

答案 1 :(得分: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