习惯这里的正则表达式。
我有一个
结构的文件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)(.* )(.* )(.* )(.* )(.* )(".*") (".*")
现在我确信有一种更优雅的方式来写这个,我不必多次重复相同的序列。
我的理解是这样的应该有效吗?
(?:(.* )*|(".*")*)
我相信(?:(.* )|(".*"))
表示匹配.*
或".*"
以及*
和(.* )
结尾处的(".*")
形成{{1} }和(.* )*
表示匹配0次或更多次。这应该与我的 工作正则表达式 没有相同的事情吗?
思想?
修改 在阅读完所有内容之后,我只是试图通过基于(。)或\“(。)\”捕获来缩短我的正则表达式而不指定捕获将发生的次数,这是不可能的。谢谢!
正确的正则表达式:(".*")*
答案 0 :(得分:1)
\ S(。*)\ S(。*)\ S(。*)\ S \ S&#34(*)(*);&#34(*); \ S&# 34;(。*)"
就够了。根据你的任务,你不能把"
分组。你的正则表达式不起作用,将"
和空格带入arr [6]和arr [5]。
如果你想单独阅读单词,如果他们在""或者不是,单词之间的空格数可以是任意的,那么:
[\s"]*(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]+(\w+)[\s"]*
实际上,它是缩短的变体,因此我们无法检查是否存在""两边都是。
如果你真的想要接受任意数量的单词,可以使用split()函数,按空格\\s?
分割,然后修剪过多的"和/或元素的空格。
例如,查看here。
仅通过正则表达式将行拆分为任意数量的组是不可能的,没有split()或类似的东西。