【问题标题】:Regex to get 2 digit-numbers not immediately preceded and followed by a character in java正则表达式获取 2 位数字,而不是紧跟在 java 中的一个字符之前和之后
【发布时间】:2017-02-22 21:25:24
【问题描述】:

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

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

  • character30 wordstart
  • wordstart 30 个字符
  • 数字 30 在这里

但不想上以下:

  • 字符30字符
  • 3000

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

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

【问题讨论】:

  • 让我们知道它是否有效。像这样的问题可以有不同的回答。如果您至少在单词边界之一处需要空格,则需要(?<!\S)\d{2}(?!\d)|(?<!\d)\d{2}(?!\S)
  • 另一个想法是匹配字母内的两个数字序列并捕获其他的:\p{L}\d{2}\p{L}|(?<!\d)\d{2}(?!\d)
  • 嘿 Wiktor,还有几个条件我忘了提,因为两位数不能以 0 开头,我不想在三位数中匹配两位数。但是,您的第二个答案给了我足够的基础来创建我正在寻找的正则表达式

标签: java regex regex-lookarounds


【解决方案1】:

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

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

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

模式匹配:

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

【讨论】:

    【解决方案2】:

    以下代码只是简单地测试了 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-20
      • 2022-08-04
      • 1970-01-01
      • 2021-05-12
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多