2017-08-10 23 views
0

在這裏習慣了正則表達式。java正則表達式用於分隔空間或捕獲內容「」

我在

word1 word2 word3 word4 word5 "word6" "word7" 
word1 word2 word3 word4 word5 "word6" "word7" 
word1 word2 word3 word4 word5 "word6" "word7" 
... 

結構的文件,我想捕捉到:

arr[0] = word1 
arr[1] = word2 
arr[2] = word3 
arr[3] = word4 
arr[4] = word5 
arr[5] = word6 
arr[6] = word7 

我的正則表達式是:(?m)(.*)(.*)(.*)(.*)(.*)(".*") (".*")

現在,我敢肯定有一個更優雅的方式來寫這個,我不必多次重複相同的序列。

我的理解是這樣的應該工作?

(?:(.*)*|(".*")*) 

相信(?:(.*)|(".*"))意味着匹配EITHER .*".*"*(.*)(".*")形成(.*)*(".*")*的端部是指匹配0次或更多次。這應該做同樣的事情,我的工作正則表達式沒有?

想法?

編輯 閱讀的一切,我無非是想通過捕捉基於()或縮短我的正則表達式後\「()\」沒有指定的次數將發生捕獲這是不可能。謝謝!

正確的正則表達式: - 它匹配時最後一次(?m)(.*) (.*) (.*) (.*) (.*) \"(.*)\" \"(.*)\"

+0

你爲什麼不只是使用BU ilt -in String.split()函數?所以,String [] arr = lineInput.split(「」); – khriskooper

+0

你需要**來捕捉每個單詞嗎?或者你只是想匹配他們?因爲如果你想捕獲它們,你需要專門編寫每個捕獲組 – Gawil

+0

什麼是你的單詞?什麼字符被允許? – Toto

回答

1
  1. 如果你有一組由*或+重複,它仍然會採取一次。唉,我們不得不多次寫這樣的團體。
  2. 空間由\ S
  3. (。*)\ S做(。*)\ S(。*)\ S(。*)\ S(。*)\ S 「(。*)」 \ s「(。*)」

就夠了。根據你的任務,你不能把"分組。您的正則表達式不起作用,將"和空格分爲arr [6]和arr [5]。

  • Example
  • 如果要獨立地,如果他們是在「」或不讀詞語,和單詞之間的空格數目可以是任意的,則:

    [\s"]*(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]* 
    

    真的,它是縮短的變體,因此我們無法檢查單詞兩側是否存在「」。

    Example

    如果你真的想接話的任意數,採用分體式()函數,用空格\\s?和修剪掉過多的「和/或從元素位後分裂。

    here例如,

    不可能通過正則表達式來分割線成組的任意數量而已,而不分裂()或類似的東西。

    +0

    你寫了**不可能通過正則表達式將行分成任意數量的組,而不用split()或類似的東西。**這是否意味着我正在用'(?:(。*)* | (「。*」)*)'不可能? –

    +0

    在閱讀所有內容(包括底部答案)之後,我只是試圖通過基於'(。*)'或'\「(。*)**」**「捕獲來縮短**正則表達式,而不指定捕獲將發生的次數**這是不可能的。謝謝! –

    +0

    @ShiZhang請區分匹配和捕獲 - 匹配是關於在對應於正則表達式的行中找到一塊。它可以使用未定義或定義的中繼器。捕獲是將所有與正則表達式組相對應的部分進行捕獲。例如,當您爲組#2使用中繼器時,它會將許多發現的片段一個接一個地捕獲到相同的結果#2中。當然,只有最後一個仍然存在。 – Gangnus