[英]split a string without adjacent characters that matched regex in java
[英]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.