Lookahead包含与左/右锚点相同的标记

时间:2014-07-18 12:03:43

标签: ruby regex

得到了经典"正则表达式引用字符串的变体"问题。我需要选择看起来像这样的字符串:

"foo bar bar"

来自像这样的长字符串

token token "maybe quoted token that can also contain spaces"

每个令牌都可以引用或不引用(这很容易使用交替的组)但有时我引用了字符串,其中包含字面引号(不以任何方式转义), 唯一可行的事情是那些引号从来没有任何一方的空格(因为那样 创建一个分隔符)。这些令牌看起来像这样:"foo-bar"baz"

我最初的想法是/"(?:[^"]|" )*"/,但这似乎不起作用,因为像这样的令牌:"here is some"quotes"被分成两部分。

我该怎么做?平台是Ruby 2.1

2 个答案:

答案 0 :(得分:2)

使用此:

"(?:[^"]|"\w)+"

"(?:[^"]|"\S)+"

您可以在the regex demo中播放示例字符串。

<强>解释

  • "与开头报价
  • 相符
  • 非捕获组(?:start [^"]|"\w)匹配...
  • 一个[^"]非引号字符,或|
  • 一个引号和一个单词"\w
  • +一次或多次
  • "收盘报价

进一步优化

如果您想在其他上下文中允许引号,例如转义引号,只需将它们添加到交替中:

"(?:\\"|[^"]|"\w)+"

允许不仅使用单词char而且使用任何非空格来引用引号:

"(?:\\"|[^"]|"\S)+"

答案 1 :(得分:1)

这个也可能适合您的需求:

".*?"(?!\S)

Regular expression visualization

Debuggex Demo


要匹配非引用的令牌:

".*?"(?!\S)|\S+

Regular expression visualization

Debuggex Demo