java - 找不到合适的正则表达式
问题描述
我想找到任何三位数字,并且只有两个数学运算符是加号和减号(+ 或 - )。
我的尝试是:
“(?=. [0-9]{1,3}) (?=. [+-])”
第一个括号表示 0-9 之间的所有数字,最少出现 1 次,最多出现 3 次。另一个括号表示 + 和 -。
我在拆分中使用此正则表达式,但是当我输入字符串时
字符串 str = "22 24 +"
-
str.split("(?=.[0-9]{1,3}) (?=.[+-])")
输出是
字符串 [] 输出数组 = {22, 24 +}
预期结果:
字符串 [] outputArray = {22,24,+}
这意味着不知何故,加号没有得到认可..
我在这里做错了什么?
解决方案
如果你想分割你的源字符串,那么正确的正则表达式是 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, +]
- 发现列表。
推荐阅读
- r - 合并 R 中的列时的动态列名
- javascript - Cloudfront 和 Lambda@Edge:删除响应标头
- java - Gradle sourceSets: classesDir 已被弃用
- ios - 使用 xcode 和 swift 从照片库中选择要显示到 Apple Watch 上的图像视图的图像
- visual-c++ - 如果它是私有的,如何访问派生类
- css - 通过 css 强制容器高度(使用 Avada 和 Wordpress)
- google-apps-script - 为表单提交分配类别的 For 循环中的颜色行
- android - Volley,ngrok - 无法使用 Volley 向 ngrok REST api 发出发布请求
- java - 为什么数组被最后一种方法覆盖?
- antlr4 - 如何在 ANTLR4 中指定可选的尾随字符?