Java - 关于使用 "split()" 的帮助
Java - Help on using "split()"
我正在尝试在 java 中编写代码,其功能类似于 Java 中的 "split()" 命令,但不会删除与正则表达式匹配的部分。例如:
String str = "ABC---DEF***GHI///JKL#@!";
然后
`str.split("[A-Za-z0-9]+")` returns `{"---", "***", "///", "#@!"}`.
但是,我想编写一个类似于 split()
的方法,将字符串拆分为正则表达式的匹配项,而不是 AROUND。
`An example of an implementaion would be:
public static String[] splitString(String input, String regex)`
因此:
`splitString("ABC---123DEF***456GHI///JKL9#@6!", "[A-Za-z0-9]+")`
会给出:
`{"ABC", "---", "123DEF", "***", "456GHI", "///", "JKL9", "#@", "6", "!"}`
因为 regexp 组是有限的,我认为,唯一的方法是按 your_pattern 和 ANTY-your_pattern 拆分并将结果 1 对 1 连接,如下所示:
ANTY-regex [^A-Za-z0-9]+
适合您。 (^ 在 [] 开头取反 int)
public String[] splitString(String input, String regex, String antiRegex)
{
String[] letters = input.split(regex);
String[] symbols = input.split(antiRegex);
String[] result = new String[letters.length + symbols.length];
for (int i = 0; i < letters.length; i++)
{
result[i] = letters[i];
if (++i < symbols.length) //important: ++i, NOT i++
{
result[i] = symbols[i];
}
}
return result;
}
UPD:没有检查字母序列是否在输入字符串中的第一个,因此如果需要,请添加 id。
您可以编写一个方法来使用正则表达式并从原始字符串中删除第一个找到的匹配项。我有点懒得写完整的代码,但在伪代码中它会是这样的。您将使用两种模式 - 一种用于单词,一种用于字符串开头的所有其他内容:
Pattern literals="(^[A-Za-z0-9]+)";
Pattern everythingElse="(^[^A-Za-z0-9]+)";
List<String> results;
while(str is not finished){
Matcher literalsMatcher= literals.matcher(str);
if(literalsMatcher.find()){
results.add(literalsMatcher.group(1));
str.subString(0,literalsMatcher.group(1).length();
}
Matcher everythingElseMatcher = everythingElse.matcher(str);
if(everythingElseMatcher.find()){
results.add(everythingElseMatcher.group(1));
str.subString(0,everythingElseMatcher.group(1).length();
}
}
类似的东西。抱歉,代码不好,但我想你能理解。
使用匹配器查找正则表达式的所有匹配项,然后自行构建拆分结果。
以下方法显示了正则表达式的所有匹配项所在的位置:
public static void findMatches(String input, String regex)
{
Matcher matcher = Pattern.compile(regex).matcher(input);
while (matcher.find()) {
System.out.printf("%d-%d%n", matcher.start(), matcher.end());
}
}
现在将您以这种方式找到的索引与 String.substring(beginIndex, endIndex)
一起使用,以创建具有您想要的拆分结果的字符串数组。
正如其他张贴者所指出的,一种方法是使用您的模式,然后反之。这可以通过一个正则表达式 ([A-Za-z0-9]*)([^A-Za-z0-9]*)
来完成
String str = "ABC---DEF***GHI///JKL#@!";
Matcher m = Pattern.compile("([A-Za-z0-9]*)([^A-Za-z0-9]*)").matcher(str);
List<String> result = new ArrayList<>();
while(m.find()) {
for(int i=1; i<=m.groupCount(); i++) {
if(!m.group(i).isEmpty()) {
result.add(m.group(i));
}
}
}
System.out.println(StringUtils.join(result, ", "));
输出:
ABC, ---, 123DEF, ***, 456GHI, ///, JKL9, #@, 6, !
这里有循环版本:
public static String[] split(String msg, String expr){
if (msg.split(expr).length == 1){
return msg.split(expr);
}
String[] tab = msg.split(expr, 2);
String exprStr = msg.substring(tab[0].length(), msg.length() - tab[1].length());
int exprLength = msg.length() - tab[0].length() - tab[1].length();
String[] tab1 = split(msg.substring(tab[0].length() + exprLength, msg.length()), expr);
String[] result = new String[1 + 1 + tab1.length];
result[0] = tab[0];
result[1] = exprStr;
for (int i = 0; i < tab1.length;++i){
result[i + 2] = tab1[i];
}
return result;
}
我正在尝试在 java 中编写代码,其功能类似于 Java 中的 "split()" 命令,但不会删除与正则表达式匹配的部分。例如:
String str = "ABC---DEF***GHI///JKL#@!";
然后
`str.split("[A-Za-z0-9]+")` returns `{"---", "***", "///", "#@!"}`.
但是,我想编写一个类似于 split()
的方法,将字符串拆分为正则表达式的匹配项,而不是 AROUND。
`An example of an implementaion would be:
public static String[] splitString(String input, String regex)`
因此:
`splitString("ABC---123DEF***456GHI///JKL9#@6!", "[A-Za-z0-9]+")`
会给出:
`{"ABC", "---", "123DEF", "***", "456GHI", "///", "JKL9", "#@", "6", "!"}`
因为 regexp 组是有限的,我认为,唯一的方法是按 your_pattern 和 ANTY-your_pattern 拆分并将结果 1 对 1 连接,如下所示:
ANTY-regex [^A-Za-z0-9]+
适合您。 (^ 在 [] 开头取反 int)
public String[] splitString(String input, String regex, String antiRegex)
{
String[] letters = input.split(regex);
String[] symbols = input.split(antiRegex);
String[] result = new String[letters.length + symbols.length];
for (int i = 0; i < letters.length; i++)
{
result[i] = letters[i];
if (++i < symbols.length) //important: ++i, NOT i++
{
result[i] = symbols[i];
}
}
return result;
}
UPD:没有检查字母序列是否在输入字符串中的第一个,因此如果需要,请添加 id。
您可以编写一个方法来使用正则表达式并从原始字符串中删除第一个找到的匹配项。我有点懒得写完整的代码,但在伪代码中它会是这样的。您将使用两种模式 - 一种用于单词,一种用于字符串开头的所有其他内容:
Pattern literals="(^[A-Za-z0-9]+)";
Pattern everythingElse="(^[^A-Za-z0-9]+)";
List<String> results;
while(str is not finished){
Matcher literalsMatcher= literals.matcher(str);
if(literalsMatcher.find()){
results.add(literalsMatcher.group(1));
str.subString(0,literalsMatcher.group(1).length();
}
Matcher everythingElseMatcher = everythingElse.matcher(str);
if(everythingElseMatcher.find()){
results.add(everythingElseMatcher.group(1));
str.subString(0,everythingElseMatcher.group(1).length();
}
}
类似的东西。抱歉,代码不好,但我想你能理解。
使用匹配器查找正则表达式的所有匹配项,然后自行构建拆分结果。
以下方法显示了正则表达式的所有匹配项所在的位置:
public static void findMatches(String input, String regex)
{
Matcher matcher = Pattern.compile(regex).matcher(input);
while (matcher.find()) {
System.out.printf("%d-%d%n", matcher.start(), matcher.end());
}
}
现在将您以这种方式找到的索引与 String.substring(beginIndex, endIndex)
一起使用,以创建具有您想要的拆分结果的字符串数组。
正如其他张贴者所指出的,一种方法是使用您的模式,然后反之。这可以通过一个正则表达式 ([A-Za-z0-9]*)([^A-Za-z0-9]*)
String str = "ABC---DEF***GHI///JKL#@!";
Matcher m = Pattern.compile("([A-Za-z0-9]*)([^A-Za-z0-9]*)").matcher(str);
List<String> result = new ArrayList<>();
while(m.find()) {
for(int i=1; i<=m.groupCount(); i++) {
if(!m.group(i).isEmpty()) {
result.add(m.group(i));
}
}
}
System.out.println(StringUtils.join(result, ", "));
输出:
ABC, ---, 123DEF, ***, 456GHI, ///, JKL9, #@, 6, !
这里有循环版本:
public static String[] split(String msg, String expr){
if (msg.split(expr).length == 1){
return msg.split(expr);
}
String[] tab = msg.split(expr, 2);
String exprStr = msg.substring(tab[0].length(), msg.length() - tab[1].length());
int exprLength = msg.length() - tab[0].length() - tab[1].length();
String[] tab1 = split(msg.substring(tab[0].length() + exprLength, msg.length()), expr);
String[] result = new String[1 + 1 + tab1.length];
result[0] = tab[0];
result[1] = exprStr;
for (int i = 0; i < tab1.length;++i){
result[i + 2] = tab1[i];
}
return result;
}