繁体   English   中英

如何从java中的字符串中删除每第12个字符

[英]How to delete every 12th character from a string in java

假设我有一个这样的字符串:

String str = "~asdfl;kjx,~rgadfaeg,dsafnewgfljka;ldfjsfa;dlkjfa;lvjvbnaber;fwelfjadfafa"

int character = 12

我想要做的是删除字符串中的每第 12 个字符,所以我会删除第 12 个索引,然后是第 24 个,然后是第 36 个,依此类推,直到字符串结束。

我删除的索引(每 12 次或每 2 次)必须等于我拥有的字符变量,因为该变量会发生变化。

我尝试使用正则表达式执行此操作:

System.out.println(s.replaceAll(".(.)", "$12"));

但它没有用。 有什么帮助吗?

有时,您只需要一个简单的for循环:

public class Test {
    public static void main(String[] args) {
        String str = "~asdfl;kjx,~rgadfaeg,dsafnewgfljka;ldfjsfa;dlkjfa;lvjvbnaber;fwelfjadfafa";
        int character = 12;

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if ((i + 1) % character != 0) {
                sb.append(str.charAt(i));
            }
        }
        String result = sb.toString();

        System.out.println(result);
    }
}

如果你坚持使用正则表达式,你可以将character变量插入到表达式中,如下所示:

public class Test {
    public static void main(String[] args) {
        String str = "~asdfl;kjx,~rgadfaeg,dsafnewgfljka;ldfjsfa;dlkjfa;lvjvbnaber;fwelfjadfafa";
        int character = 12;

        System.out.println(str.replaceAll("(.{" + (character - 1) + "}).", "$1"));
    }
}

要使用正则表达式删除每 12 个字符,请使用以下模式:

(.{11}).

然后仅替换为捕获的$1

示例 Java 代码:

String str = "~asdfl;kjx,~rgadfaeg,dsafnewgfljka;ldfjsfa;dlkjfa;lvjvbnaber;fwelfjadfafa";
String output = str.replaceAll("(.{11}).", "$1");
System.out.println(output);

这打印:

~asdfl;kjx,rgadfaeg,dsfnewgfljka;dfjsfa;dlkja;lvjvbnabe;fwelfjadfaa

编辑:

要对某些固定宽度进行正则表达式替换,请使用:

String str = "~asdfl;kjx,~rgadfaeg,dsafnewgfljka;ldfjsfa;dlkjfa;lvjvbnaber;fwelfjadfafa";
int width = 11;
String output = str.replaceAll("(.{" + width + "}).", "$1");
System.out.println(output);

避免char

Java 中的char类型是遗留的,本质上是坏的。 作为 16 位值, char不能表示大多数字符。

代码点

相反,使用代码点整数。

制作每个字符代码点的数组。

int[] codePointsArray = input.codePoints().toArray() ;

列出该数组。

List< Integer > codePoints = List.of( codePointsArray ) ;

或者:

List< Integer > codePoints = input.codePoints().boxed().toList() ;

制作我们需要访问该列表的每个元素的索引的IntStream 使用每个索引拉出一个代码点,并按第 n 个元素过滤。 收集到StringBuilder

String result =
    IntStream
    .range( 0 , codePoints.size() )
    .filter( n -> n % 12 != 0 )
    .mapToObj( codePoints :: get )
    .collect( StringBuilder :: new , StringBuilder :: appendCodePoint , StringBuilder :: append )
    .toString()
;

这是未经测试的代码,但应该接近您的需要。

我的代码是基于我在这个类似的问题上看到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM