簡體   English   中英

Java Regex / Split不會丟失字符

[英]Java Regex/Split without lose characters

我有這個字符串:

String str = "Filtración con membrana - Nanofiltración Ósmosis inversa Desinfección";

我想得到一個包含這些元素的數組:

["Filtración con membrana - Nanofiltración", "Osmosis inversa", "Desinfección"]

我這樣分裂:

String[] elements = str.split("[a-zà-ú] [A-ZÀ-Ú]");

但是我得到了這個數組,而不是:

["Filtración con membrana - Nanofiltració", "osmosis invers", "esinfección"]

我能做什么? 我只想刪除拆分中的空格(“”),而不要刪除字符。 謝謝!

為什么[a-zà-ú] [A-ZÀ-Ú]不起作用?

正則表達式的問題在於,空間兩側的字符類將每個使用一個字符。 因此split函數確實會刪除與正則表達式匹配的兩個字符,並且不會包含在輸出中

與其使用正則表達式,不如嘗試環顧四周

String[] elements = str.split("(?<=[a-zà-ú]) (?=[A-ZÀ-Ú])");
  • (?<=[a-zà-ú])看斷言。 檢查空格是否由類中的字符開頭。 但這不會消耗角色。

  • (?=[A-ZÀ-Ú])提前聲明。 檢查是否在空格后跟這些字符中的任何一個。

正則表達式演示

測試

String str = "Filtración con membrana - Nanofiltración Ósmosis inversa Desinfección";
String[] elements = str.split("(?<=[a-zà-ú]) (?=[A-ZÀ-Ú])");
for (String i : elements)
    System.out.println(i);

將輸出為

Filtración con membrana - Nanofiltración
Ósmosis inversa
Desinfección

您可以使用:

String str = "Filtración con membrana - Nanofiltración Ósmosis inversa Desinfección";
String[] toks = str.split( "(?<=\\p{javaLowerCase}) +(?=\\p{javaUpperCase})" );
for (String tok: toks)
    System.out.printf("=> <%s>%n", tok);

輸出:

=> <Filtración con membrana - Nanofiltración>
=> <Ósmosis inversa>
=> <Desinfección>

此正則表達式匹配1個或多個空格,並使用超前模式(?=\\\\p{javaUpperCase}) ,這意味着空格后必須是Unicode大寫字母。 它還使用了一個后向(?<=\\\\p{javaLowerCase}) ,這意味着空格必須以Unicode小寫字母開頭。

暫無
暫無

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

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