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很快,不确定所有引擎都使用它们。当然,程序员不知道如何使用它们。例如单词词典。