2010-06-30 71 views
1

嘿,我试图用正则表达式来计算字符串中前面没有反斜杠的引号数量。 例如下面的字符串:在没有反斜杠的字符串中计数引号

  • "\"Some text
  • "\"Some \"text

我以前是用String#count('"') 的代码显然这是不够

当我指望这两个例子中,我需要的结果的报价仅是1

我一直在寻找这里类似的问题,并使用lookbehinds香港专业教育学院尝试,但不能让他们在红宝石工作。

我从这个previous question

  • /[^\\]"/
  • 试过 Rubular以下regexs
  • ^"((?<!\\)[^"]+)"
  • ^"([^"]|(?<!\)\\")"

他们都没有给我之后的结果IM

也许正则表达式不是这样做的。也许一个程序化的方法是解决方案

+1

Ruby(直到1.8)不支持lookbehind,这可能是为什么它不起作用。 – 2010-06-30 11:27:52

回答

2
result = subject.scan(
    /(?:  # match either 
    ^  # start-of-string\/line 
    |   # or 
    \G  # the position where the previous match ended 
    |   # or 
    [^\\]  # one non-backslash character 
    )   # then 
    (\\\\)* # match an even number of backslashes (0 is even, too) 
    "   # match a quote/x) 

给你除了未转义那些的所有引用字符的阵列(可能与前一个非引号字符)。需要

\G锚匹配连续报价,和(\\\\)*可以确保在发生在奇数报价之前(取Amarghosh的正确告诫考虑)反斜杠只算做逃脱字符。

+0

+1 for \ G。这就是我在尝试中丢失的那一点。 – sepp2k 2010-06-30 12:10:25

+0

它返回一个nils数组,但是(\(?:^ | \ G | [^ \\])(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\') \)*“/ x).size => 2' – Rob 2010-06-30 12:41:20

3

string.count('"') - string.count("\\"")怎么样?

+0

以及我从来没有想过这样做,它的作品。我认为这样做。 :) – Rob 2010-06-30 11:36:11

+1

+1思维直白,简单。 – Amarghosh 2010-06-30 11:54:25

+0

对不起,但我不明白它是如何工作的,因为'count(“\\”“)'计算反斜杠的数量加上双引号的数量,每一个都是独立的。 (''') - string.scan(/ \\“/)。count' would better work。 – JPG 2015-12-01 13:10:09