Java 分割一串坐标和符号

Java 分割一串坐标和符号,java,regex,string,split,Java,Regex,String,Split,我想分割一行坐标和符号,如:(4,9);(741,5)+,(555,82)-, 分成以下部分:4,9,741,5,555,82,- 所以我想出了这个表达式:,(?=([0-9]+)|(?),与其拆分,不如只搜索你要找的东西 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String... args) {

我想分割一行坐标和符号,如:
(4,9);(741,5)+,(555,82)-,

分成以下部分:
4,9,741,5,555,82,-


所以我想出了这个表达式:
,(?=([0-9]+)|(?),与其拆分,不如只搜索你要找的东西

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+|[?+\\-]

对于给定的输入,结果是相同的,但是这个版本意味着像“45-8”这样的序列会产生三个匹配(
45
-
,和
8
),而不是一个(
45-8
)。

这里是一个拆分解决方案:

String s = "(4, 9) ?, (741, 5) +, (555, 82) -,";
String pat = "[\\D&&[^+?-]]+";
String[] res = s.replaceFirst("^"+pat, "").split(pat);
System.out.println(Arrays.toString(res));

[\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);
String rx=“\\d+|[-?+]”;
List lst=new ArrayList();
模式p=模式编译(rx);
匹配器m=p.Matcher(“(4,9)”,(741,5)+,(555,82)-,”;
while(m.find()){
第一次添加(m组(0));
}
系统输出打印项次(lst);

请参见

也许
[\D&&[^+?-]]+
拆分([\\D&&[^+?-]+])
)对您有效?@WiktorStribiżew是的,它有效,谢谢!它的分隔符是“不是一个数字”和“不是+-?”。我们可以应用de morgan并使用表达式“一个数字或+-?”?“?是的,这是一个或多个非数字符号,除了
+
-
。de Morgan版本是下面答案中的表达式:它用于匹配而不是拆分。您最好全局匹配
\d+-+?]
避免糟糕的拆分。拆分部分只是
[^-+\d]+
Cool,我不知道匹配而不是拆分是可能的。@slnIt将单个文本组合到一个类中而不是单独的替换更有效。因此
\d++[-+?]
可能会快50%。@sln虽然我不得不承认我很惊讶这会对性能造成影响…似乎这对正则表达式引擎来说是一个微不足道的优化。是的,对于单字符替换,引擎应该创建trie-trie-EXACT[+\-?]使用跳转表的。在这种情况下没有跳转,或者它指向内联true。类ANYOF[+\-?]不使用跳转表。由于此正则表达式只有1级trie,因此速度相同,但计算机以太中的某些变体除外。trie很快,不确定所有引擎都使用它们。当然,程序员不知道如何使用它们。例如单词词典。