2010-06-30 94 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