![](/img/trans.png)
[英]Java Regex Help: Splitting String on spaces, “=>”, and commas
[英]Complex splitting of a String using REGEX, only discarding spaces
在 Java (JDK 11) 中,請考慮以下字符串:
String hello = "333+444 5qwerty5 006 -7";
我試圖想出一個正則表達式,它將分割任何不是數字的東西,同時保留除空格之外的分隔符。 所以在上面的例子中,我想最終得到以下數組:
["333" , "+" , "444" , "5" , "q" , "w" , "e" , "r" , "t" , "y" , "5" , "006" , "-7"]
請注意006和-7 中的前導零。 我使用的代碼如下:
String[] splited = s.split("((?<=[^0-9]+)|(?=[^0-9]+)|(\\s+))");
但是,我可以看到我的數組保留了空格。 我一輩子都無法弄清楚我的錯誤。 有什么想法嗎?
編輯:原來要求變得越來越復雜。 最終,我不得不根據上面的示例輸入獲得以下集合:
["333+444" , "5" , "q" , "w" , "e" , "r" , "t" , "y" , "5" , "006" , "-7"]
因此,如果整數和運算符之間沒有空格+ - * / % ^
,則不要拆分它們。 我在實施此規則時遇到了問題,而且不應該拆分前導零和負數。
基於此,事實證明使用第四只鳥的樣本非常簡單,其中使用matcher()
而不是split()
。 RegEx 語法更易於理解、故障排除和構建。
也許我可以問另一個問題來滿足額外的復雜性,但我認為使用 StackOverflow 繼續問非常相似的問題是不對的,因為一個人被卡住了。
除了使用 split,您還可以匹配所有部分:
-?\d+|\S
模式匹配:
-?
可選匹配連字符\\d+
匹配 1+ 個數字|
或者\\S
匹配單個非空白字符例子
String regex = "-?\\d+|\\S";
String string = "333+444 5qwerty5 006 -7";
List<String> allMatches = new ArrayList<String>();
Matcher m = Pattern.compile(regex).matcher(string);
while (m.find()) {
allMatches.add(m.group());
}
System.out.println(Arrays.toString(allMatches.toArray()));
輸出
[333, +, 444, 5, q, w, e, r, t, y, 5, 006, -7]
這適用於您的示例:
String[] split = hello.split("(?<=\\d)(?=\\D) *|(?<=[^\\d -])(?=[\\d-])|(?<=[\\d-])(?=[^\\d -])|(?<=[^\\d -])(?=[^\\d -])");
重要的部分是:
[\\\\d-]
而不是\\d
所以減號被視為“數字”[^\\d -]
而不是\\D
來防止詞尾出現空分割元素*
以捕獲(“刪除”)空格測試代碼:
String hello = "333+444 5qwerty5 006 -7";
String[] split = hello.split("(?<=\\d)(?=\\D) *|(?<=[^\\d -])(?=[\\d-])|(?<=[\\d-])(?=[^\\d -])|(?<=[^\\d -])(?=[^\\d -])");
System.out.println(Arrays.toString(split));
輸出:
[333, +, 444, 5, q, w, e, r, t, y, 5, 006, -7]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.