2016-11-14 62 views
1

假設我有一個這樣的字符串:abc def ghi jkl(爲簡單起見,我在末尾放了一個空格,但它對我來說並不重要),我想捕獲它的「塊「如下:使用正則表達式標記字符串

abc 

def 

ghi 

jkl 

當且僅當字符串中有1-4個」塊「。我已經試過以下的正則表達式:

^([^ ]+){1,4}$ 

在Regex101.com但只抓住了最後一次出現。發出警告:

重複捕獲組將只捕獲最後一次迭代。如果你對數據不感興趣,可以在重複組周圍設置一個捕獲組來捕獲所有迭代或使用非捕獲組

如何更正正則表達式以實現我的目標?

+1

這等1個或多個字符是一個XY的問題。用空格拆分/分解字符串,並檢查結果數組是否包含4個非空元素。但是,可以使用PCRE而不是POSIX來檢查和*匹配多個隨後出現的*(不捕獲)。 –

+0

好的,所以我可以使用編程語言「手動」,而不涉及正則表達式,但有沒有更自動的解決方案?事實上,它旨在成爲更復雜表達的一部分。 PCRE對我來說是可以接受的。 – mzzz

+0

如果您的可執行文件只允許訪問捕獲組值,那麼沒有適合您的解決方案。 –

回答

0

由於您無法訪問代碼,因此您可能會使用的唯一解決方案是基於\G運算符的正則表達式,該運算符只允許連續匹配,並且在開始時錨定一個預測,這將需要1到4個非空白塊在字符串中。

(?:^(?=\s*\S+(?:\s+\S+){0,3}\s*$)|\G(?!^))\s*\K\S+ 

regex demo

詳細

  • (?:^(?=\s*\S+(?:\s+\S+){0,3}\s*$)|\G(?!^)) - 來檢查,如果一個自定義的邊界:

    • ^(?=\s*\S+(?:\s+\S+){0,3}\s*$) - 字符串開始位置(^)筆帽之後具有1至4個非空白塊,與1+空格分開,並且拖尾/領先空格是允許的,也
    • | - 或
    • \G(?!^) - 當前位置在先前成功的匹配的端部( \G也匹配的字符串的開始,因此,我們必須使用負先行以排除匹配位置,由於執行一個單獨的檢查)
  • \s* - 零個或多個空格

  • \K - 匹配復位操作丟棄到目前爲止匹配的所有文字
  • \S+ - 比空白
+1

不客氣,公認。 – mzzz

+0

雖然表達式存在問題。它在regex101.com上工作正常,但是在C++代碼片段(使用「普通」C接口)內使用的只匹配第一個令牌,即函數pcre_exec()返回1.例如,對於「abc def ghi」它只會返回「abc」。任何幫助? – mzzz

+0

這與我的答案無關,但你可能會看看[this SO thread](http://stackoverflow.com/a/1421923/3832970),我想你會在那裏找到解決新問題的解決方案。 –

0

它可以在Linux上使用TR來完成:

tr -sc 'a-zA-Z' '\n' <text.txt> out_text.txt 

其中一個文件──test.txt文件是你的字符串進行標準化。

+0

該表達式嵌入在一個常規的可執行文件中,所以我不想這樣做。 – mzzz

相關問題