我想分割一行坐标和符号,例如:(4, 9) ?, (741, 5) +, (555, 82) -,
要拆分为以下部分:4, 9, ?, 741, 5, +, 555, 82, -
所以我想出了这个表达式:",(?=([0-9]+))|(?<=([0-9]+)),| +|\\(|\\)?"
但是它匹配数字而不是数字和很多空字符串...我该如何解决?
如果表达式后面或前面有,
,其他+-?
符号,则该表达式应与数字匹配。
这是使用String.split()
。
答案 0 :(得分:2)
而不是分裂,如何只搜索你正在寻找的东西?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String... args) {
String input = "(4, 9) ?, (741, 5) +, (555, 82) -,";
Matcher matcher = Pattern.compile("[\\d?+\\-]+").matcher(input);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
// Output:
// 4
// 9
// ?
// 741
// 5
// +
// 555
// 82
// -
根据您的输入,这个正则表达式可能更好:
\\d+|[?+\\-]
对于给定的输入,结果是相同的,但是这个版本意味着像&#34; 45-8&#34;导致三个匹配(45
,-
和8
),而不只是一个(45-8
)。
答案 1 :(得分:1)
这是一个拆分解决方案:
String s = "(4, 9) ?, (741, 5) +, (555, 82) -,";
String pat = "[\\D&&[^+?-]]+";
String[] res = s.replaceFirst("^"+pat, "").split(pat);
System.out.println(Arrays.toString(res));
请参阅regex demo
[\D&&[^+?-]]+
模式匹配除+
,?
,-
之外的一个或多个非数字符号。带有replaceFirst
锚点的^
前置于该模式会从字符串的开头删除匹配项以删除结果中的空数组元素。 &&[^...]
这里是一个字符类减法语法,我们匹配之前的所有内容,除了^
之后的内容。请注意,\D
(任何非数字)等于[^\d]
(除了数字之外的任何字符),因此,您实际上可以编写与[^\d+?-]
相同的模式。
因为你问:
我们可以在这上面应用de morgan并使用“数字或+ - ?”这个词吗?
这取决于您对数字的含义,但您可能希望匹配一大块数字,或+
,-
或?
。在这种情况下,您确实需要更改:\d+|[-?+]
。
String rx = "\\d+|[-?+]";
List<String> lst = new ArrayList<>();
Pattern p = Pattern.compile(rx);
Matcher m = p.matcher("(4, 9) ?, (741, 5) +, (555, 82) -,");
while (m.find()) {
lst.add(m.group(0));
}
System.out.println(lst);
请参阅Java demo