在 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"]
因此,如果整數和運算子之間沒有空格 - * / % ^,則不要拆分它們。我在實施此規則時遇到了問題,而且不應該拆分前導零和負數。
uj5u.com熱心網友回復:
除了使用 split,您還可以匹配所有部分:
-?\d |\S
模式匹配:
-?可選匹配連字符\d匹配 1 個數字|或者\S匹配單個非空白字符
請參閱正則運算式演示和Java 演示。
例子
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]
uj5u.com熱心網友回復:
這適用于您的示例:
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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/313187.html
下一篇:如何更新資料庫?
