在Java (JDK 11)中,考虑以下字符串:
String hello = "333+444 5qwerty5 006 -7";我试着想出一个RegEx,它将分割任何不是数字的东西,同时保留除空格之外的分隔符。因此,在上面的示例中,我希望得到以下数组:
["333" , "+" , "444" , "5" , "q" , "w" , "e" , "r" , "t" , "y" , "5" , "006" , "-7"]请注意006和-7中的前导零.我使用的代码如下:
String[] splited = s.split("((?<=[^0-9]+)|(?=[^0-9]+)|(\\s+))");但是,我可以看到我的数组保留了空间。我不能为了我的生命而想出我的错误。有什么想法吗?
编辑:原来需求变得越来越复杂。最后,根据上面的示例输入,我必须获得以下集合:
["333+444" , "5" , "q" , "w" , "e" , "r" , "t" , "y" , "5" , "006" , "-7"]因此,如果整数和运算符+ - * / % ^之间没有空格,那么就不要对它们进行拆分。我在执行这个规则时遇到了一些问题,还有一个事实,即不应该分割前导零和负数。
在此基础上,使用--第四种鸟的示例--而不是split() --进行操作非常简单,RegEx语法更容易理解、排除故障和建立在此基础上。
也许我本可以提出另一个问题,以满足额外的复杂性,但我认为使用StackOverflow继续问非常类似的问题是不对的,因为其中一个问题被困住了。
发布于 2021-10-14 06:24:54
与使用split不同,您还可以匹配以下所有部件:
-?\d+|\S模式匹配:
-?可选择匹配连字符\d+匹配1+数字|或\S匹配单个非空白字符示例
String regex = "-?\\d+|\\S";
String string = "333+444 5qwerty5 006 -7";
List<String> allMatches = new ArrayList<String>();
Matcher m = Pattern.compile(regex).matcher(string);
while (m.find()) {
allMatches.add(m.group());
}
System.out.println(Arrays.toString(allMatches.toArray()));输出
[333, +, 444, 5, q, w, e, r, t, y, 5, 006, -7]发布于 2021-10-14 01:58:12
这适用于您的示例:
String[] split = hello.split("(?<=\\d)(?=\\D) *|(?<=[^\\d -])(?=[\\d-])|(?<=[\\d-])(?=[^\\d -])|(?<=[^\\d -])(?=[^\\d -])");重要的部分是:
[\\d-]代替\d,因此减号被视为“数字”[^\d -]而不是\D来防止字尾处的空拆分元素*以捕获(“删除”)空间测试代码:
String hello = "333+444 5qwerty5 006 -7";
String[] split = hello.split("(?<=\\d)(?=\\D) *|(?<=[^\\d -])(?=[\\d-])|(?<=[\\d-])(?=[^\\d -])|(?<=[^\\d -])(?=[^\\d -])");
System.out.println(Arrays.toString(split));输出:
[333, +, 444, 5, q, w, e, r, t, y, 5, 006, -7]https://stackoverflow.com/questions/69563943
复制相似问题