2013-05-01 52 views
1

除非換行符後面的字符是公開報價,否則我想在換行符之前找到沒有匹配的近似報價(「)的開放報價(」)。例如:正則表達式找到缺少近似報價的段落

He said, 「bla bla bla 
She didn't listen. 

上面應該找到「唧唧歪歪

然而,接下來的例子應該不匹配,因爲下一行有公開報價開始:

He said, 「bla bla bla 
「bla bla bla.」 

僅供參考,我正在使用C#Regex類。提前致謝。

回答

0
「(?>[^\r\n「」]*)(?!\r?\n「)(?!」) 

將匹配從開口報價文本到行的結束,除非有一個閉引號在中間或下一行具有開口報價開始。

假設你的目標是解決這些線,即插入結束報價在必要時

result = Regex.Replace(subject, 
    @"「   # Match an opening quote 
    (?>   # Match in an atomic group (no backtracking!): 
    [^\r\n「」]* # any characters except newlines or quotes 
    )   # End of atomic group 
    (?!\r?\n「) # Assert that no linebreak, followed by an opening quote, follows 
    (?!」)  # Assert that no closing quote follows", 
    "$0」", RegexOptions.IgnorePatternWhitespace); 

將這樣做。

+0

謝謝!我將此標記爲答案,儘管我必須在第二次出現\ r \ n時添加[和],因爲顯然我並不總是都有。所以:「(?> [^ \ r \ n」「] *)(?![\ r \ n]」)(?!「) – 2013-05-01 23:01:32

+0

@DanThomas:在這種情況下,我認爲'\ r?\ n'更健壯。我編輯了我的答案。 – 2013-05-02 05:18:40

+0

很明顯,我對正則表達式很陌生。爲什麼它更強大? – 2013-05-02 14:33:11

0

請問這樣的工作嗎?

"[^"]*\n[^"] 
0

請考慮下面的通用正則表達式的powershell示例。

("[^"\n]*)("|\n(?!"))

$Matches = @() 
    $String = '"bla bla bla 
She didn''t listen. 
He said, "bla bla bla 
"bla bla bla."' 
    Write-Host start with 
    write-host $String 
    Write-Host 
    Write-Host found 
    ([regex]'("[^"\n]*)("|\n(?!"))').matches($String) | foreach { 
     write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'" 
     } # next match 

息率
start with 
"bla bla bla 
She didn't listen. 
He said, "bla bla bla 
"bla bla bla." 

found 
key at 0 = '"bla bla bla 
' 
key at 57 = '"bla bla bla.' 

摘要
  • ("[^"\n]*)返回所有非」,\ n個字符從打開雙引號
  • ("|\n(?!"))停止時遇到的第一個」,或\ n
  • (?!")確保\ N線後面沒有之前它由一個雙引號

我似乎無法擺脫回報在第一場比賽中換行符的情況下,這可能更容易使用「裁減」語句。

+0

謝謝!但是,這並不完全正確。我不想在「57鍵」找到。 - 第一場比賽的換行符是可以的,所以不要擔心。 – 2013-05-01 22:46:55