首页 > 解决方案 > 找不到合适的正则表达式

问题描述

我想找到任何三位数字,并且只有两个数学运算符是加号和减号(+ 或 - )。

我的尝试是:

“(?=. [0-9]{1,3}) (?=. [+-])”

第一个括号表示 0-9 之间的所有数字,最少出现 1 次,最多出现 3 次。另一个括号表示 + 和 -。

我在拆分中使用此正则表达式,但是当我输入字符串时

字符串 str = "22 24 +"

-

str.split("(?=.[0-9]{1,3}) (?=.[+-])")

输出是

字符串 [] 输出数组 = {22, 24 +}

预期结果:

字符串 [] outputArray = {22,24,+}

这意味着不知何故,加号没有得到认可..

我在这里做错了什么?

标签: javaregex

解决方案


如果你想分割你的源字符串,那么正确的正则表达式是 eg " +(?=\\d{1,3}|[+-])",意思是:

  • 一系列空格( 在标记之间有多个空格的情况下,我也添加了“+”来拆分)。
  • 正向前瞻 - 1 到 3 位或正负。

另一种可能的方法是查找所有匹配项。那么正则表达式可以是 eg "\\d{1,3}|[-+]",意思是:

  • 备选方案 1:1 到 3 位数字的序列。
  • 备选方案 2:加号或减号。

下面你有一个示例程序:

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.List;

public class Simple{
  public static void main(String args[]){
    String str = "22  24  +";
    // Variant 1 - split
    String [] outArr = str.split(" +(?=\\d{1,3}|[+-])");
    System.out.println(Arrays.toString(outArr));
    // Variant 2 - find all matches
    List<String> allMatches = new ArrayList<String>();
    Matcher m = Pattern.compile("\\d{1,3}|[-+]").matcher(str);
    while (m.find()) {
      allMatches.add(m.group());
    }
    System.out.println(Arrays.toString(allMatches.toArray()));
  }
}

两种变体都打印[22, 24, +]- 发现列表。


推荐阅读