2017-02-27 109 views
-1

我有串這樣的:拆分字

aaaaaas#aa##aa 

而且我想用split()和正則表達式來完成這個algoritm:

  • 得到5個第一個字符
  • 如果它有一些非單詞字符,剪成最後一個非單詞字符,包括非單詞字符
  • 如果它沒有任何非單詞字符,這5個字符
  • 從去年切割重複,直到字符串結尾這個例子的

回報應該是這樣的:

aaaaa 
as# 
aa## 
aa 

甚至可以用正則表達式和split()?這

.*([\W]+)\W 

給我去年非文字字符的字符(例如它會aaaaaas#aa##),但如何將其組到最大。 5個字符,分裂並繼續從前一場比賽結束?

https://regex101.com/r/xA9kG3/14

+3

輸入'a#a#a#a#'是否被分割爲'a#','a#','a#','a#',或者被分割爲'a#a#','a#a#' ?子彈1表示爲*「得到5個字符」*,即'a#a#a',然後符號2表示爲*「剪切爲**最後**非單詞字符」*,即'A#A#'。但是,你是否認爲它會在「#」後切斷? – Andreas

+0

在我的(現在已刪除的答案)下的OP註釋'aa ##### aa應該輸出aaa ##,## aa,因爲最後一個字短於5個字符,我沒有提到它。所以我應該添加子彈:如果拆分的單詞是最後5個字符或更短,然後5個字符(因此它們是字符串中的最後一個字符)返回它' – Pshemo

+1

說實話你的問題看起來像[X/Y問題](http:// meta .stackexchange.com /問題/ 66377 /什麼,是最XY-問題)。你給了我們一些步驟,但我們仍然不知道*有什麼意義*?也許你正在尋找像這樣的東西:http://stackoverflow.com/questions/25853393/split-a-string-in-java-into-equal-length-substrings-while-maintaining-word-bound? – Pshemo

回答

2

甚至可以用正則表達式和split()

是的,但是完全實現你所描述的內容相當麻煩。特別要注意的是,您的規範描述了您要接受的子字符串,而split()適用於子字符串之間的匹配分隔符

儘管如此,您仍然可以通過對您的分隔符模式使用零寬度lookaround斷言來做這種事情,但事實證明需要一個漫長而難看的正則表達式來準確地實現您的特定需求。最重要的是,5個字符的窗口使事情變得非常糟糕。 Java正則表達式確實支持特殊的\G以匹配上一次匹配的尾部邊界(如果有的話),這使得作業可能是

這是我想出來的最好的模式:

(?x) (?<= \\G\\w{5}) 
    | (?<= \\G .{4} \\W) 
    | (?<= \\G .{3} \\W) (?= \\w) 
    | (?<= \\G .{2} \\W) (?= \\w{2} | \\w\\z) 
    | (?<= \\G . \\W) (?= \\w{3} | \\w{1,2}\\z) 
    | (?<= \\G  \\W) (?= \\w{4} | \\w{1,3}\\z) 

(請注意,註釋模式下啓用,使空白的格局顯着。)

有一個替代的分隔符隱含跟隨自上次匹配以來的五個單詞字符,以及以非單詞字符結尾的令牌的每個可能的令牌長度。我順便觀察到,在這種情況下,分隔符不一定落在第一個非字/字邊界上,也不一定在這樣的邊界上,而是在五個字符的最後一個非字字符之後。此外,在最後一個標記之後不需要分隔符。