簡體   English   中英

使用 REGEX 對字符串進行復雜拆分,僅丟棄空格

[英]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匹配單個非空白字符

請參閱正則表達式演示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]

這適用於您的示例:

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.

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