这是我的正则表达式......
(?<=")[^"]+(?=")|[-+@]?([\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'
任何改变会使双引号的想法只适用于短语本身,而不是引用词间?感谢。
答案 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*))
直播示例: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] =>
)