2017-08-10 25 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