簡體   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