簡體   English   中英

Java分裂正在吃我的角色

[英]Java split is eating my characters

我有一個像String str = "la$le\\\\$li$lo"這樣的String str = "la$le\\\\$li$lo"

我想拆分它以獲得以下輸出"la","le\\\\$li","lo" \\ $是一個$轉義所以它應該留在輸出中。

但是當我做str.split("[^\\\\\\\\]\\\\$")得到"l","le\\\\$l","lo"

從我得到的我的正則表達式匹配$和i $然后刪除。 知道如何讓我的角色回來嗎?

謝謝

使用零寬度匹配斷言:

    String str = "la$le\\$li$lo";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<!\\\\)\\$")
    )); // prints "[la, le\$li, lo]"

正則表達式本質上是

(?<!\\)\$

它使用負向lookbehind斷言沒有前面的\\

也可以看看


分裂斷言的更多例子

簡單的句子分裂,保持標點符號:

    String str = "Really?Wow!This.Is.Awesome!";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[.!?])")
    )); // prints "[Really?, Wow!, This., Is., Awesome!]"

使用\\G將長字符串拆分為固定長度的部分

    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"

使用lookbehind / lookahead組合:

    String str = "HelloThereHowAreYou";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[a-z])(?=[A-Z])")
    )); // prints "[Hello, There, How, Are, You]"

相關問題

$和i $被刪除的原因是regexp [^\\\\]\\$匹配任何不是'\\'后跟'$'的字符。 您需要使用零寬度斷言

這是同樣的問題,人們試圖找到q而不是你。

在正確的正則表達式中的第一個剪切是/(?<!\\\\)\\$/ (java中的"(?<!\\\\\\\\)\\\\$"

class Test {
 public static void main(String[] args) {
  String regexp = "(?<!\\\\)\\$";
  System.out.println( java.util.Arrays.toString( "1a$1e\\$li$lo".split(regexp) ) );
 }
}

產量:
[1a, 1e\\$li, lo]

您可以嘗試先用另一個字符串替換“\\ $”,例如$(“%24”)的URL編碼,然后拆分:

String splits[] = str.replace("\$","%24").split("[^\\\\]\\$");
for(String str : splits){
   str = str.replace("%24","\$");
}

更一般地說,如果str是由類似的東西構造的

str = a + "$" + b + "$" + c

然后你可以在將它們附加到一起之前URLEncode a,b和c

import java.net.URLEncoder.encode;
...
str = encode(a) + "$" + encode(b) + "$" + encode(c)
import java.util.regex.*;
public class Test {
    public static void main(String... args) {
        String str = "la$le\\$li$lo";
        Pattern p = Pattern.compile("(.+?)([^\\\\]\\$)");
        Matcher m = p.matcher(str);
        while (m.find()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }
}

l
a$
le\$l
i$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM