正则表达式将词组间词语作为另一个引用词组返回

时间:2013-07-15 15:39:58

标签: regex

这是我的正则表达式......

(?<=")[^"]+(?=")|[-+@]?([\w]+(-*\w*)*)

这是我的测试代码......

"@One one" @two three four "fi-ve five" six se-ven "e-ight" "nine n-ine nine"

我不希望在结果中返回双引号,但这似乎使它返回其他引用短语之间的部分作为引用短语本身。以下是当前结果(不包括单引号)......

'@One one'
' @two three four '
'fi-ve five'
' six se-ven '
'e-ight'
' '
'nine n-ine nine'

而我真的希望它将这些作为单独的结果(不包括单引号)返回......

'@One one'
'@two'
'three'
'four'
'fi-ve five'
'six'
'se-ven'
'e-ight'
'nine n-ine nine'

任何改变会使双引号的想法只适用于短语本身,而不是引用词间?感谢。

3 个答案:

答案 0 :(得分:1)

你遇到的问题是正则表达式没有“内存” - 也就是说,它们无法记住最后的引号是打开还是关闭(正如同义词不适合解析HTML / XML一样) )。但是,如果您可以假设引用遵循标准规则,则引号和引用的文本之间没有空格(而如果引号和相邻单词之间有空格,则该单词不是引用),然后你可以使用负面的环顾(?!\s)(?<!\s)来确保这些地方没有空间:

(?<=")(?!\s)[^"]+(?<!\s)(?=")|[-+@]?([\w]+(-*\w*)*)

澄清假设是什么(使用下划线标记有问题的空格):

"This is a quote"_this text is not a quote_"another quote"
^               ^ ^                      ^ ^             ^
  no space here   |                      |    none here
  between word    ⌞  but there is here   ⌟
  and mark

编辑:此外,您可以通过删除组并使用字符类来简化正则表达式:

(?<=")(?!\s)[^"]+(?!\s)(?=")|[-+@]?[\w]+[-\w]*

这样可以更容易(无论如何)获得结果:

>> str = "\"@One one\" @two three four \"fi-ve five\" six se-ven \"e-ight\" \"nine n-ine nine\""
=> "\"@One one\" @two three four \"fi-ve five\" six se-ven \"e-ight\" \"nine n-ine nine\""
>> rex = /(?<=")(?!\s)[^"]+(?!\s)(?=")|[-+@]?[\w]+[-\w]*/
=> /(?<=")(?!\s)[^"]+(?!\s)(?=")|[-+@]?[\w]+[-\w]*/
>> str.scan rex
=> ["@One one", "@two", "three", "four", "fi-ve five", 
    "six", "se-ven", "e-ight", "nine n-ine nine"]

答案 1 :(得分:0)

当您一次搜索一个内容时,您的代码就会起作用。我不确定在什么情况下使用它,但你可以关闭任何全局标志,它只会匹配第一次出现。然后只需从正面修剪该字符串并再次运行,依此类推。

编辑:你收到他们的订单是否重要? 两个单独的正则表达怎么样?

第一个:"([^"]*)"

这将匹配您要保留的所有引用字符串,使用捕获进行正则表达式替换,您可以捕获所有字符串并用空字符串替换它们。

第二:只需匹配之后剩下的每一个字。

答案 2 :(得分:0)

描述

这并不完美,因为捕获组0确实包含匹配,包括前导/尾随空格和引号,但捕获组1将获取引号内的文本,而组2获取单个单词。无论个别报价周围的空白区域如何,这都可以。

(?!\Z)(?:\s*"([^"]*)"|\s*(\S*))

enter image description here

实施例

直播示例:http://www.rubular.com/r/HrHJIlMieb

示例文字

注意5到6之间可能存在困难的边缘情况

"@One one" @two three four "fi-ve five"six se-ven "e-ight" "nine n-ine nine"

捕获论坛

[0] => Array
    (
        [0] => "@One one"
        [1] =>  @two
        [2] =>  three
        [3] =>  four
        [4] =>  "fi-ve five"
        [5] =>  six
        [6] =>  se-ven
        [7] =>  "e-ight"
        [8] =>  "nine n-ine nine"
    )

[1] => Array
    (
        [0] => @One one
        [1] => 
        [2] => 
        [3] => 
        [4] => fi-ve five
        [5] => 
        [6] => 
        [7] => e-ight
        [8] => nine n-ine nine
    )

[2] => Array
    (
        [0] => 
        [1] => @two
        [2] => three
        [3] => four
        [4] => 
        [5] => six
        [6] => se-ven
        [7] => 
        [8] => 
    )