RegEx查找缺少近距离报价的段落

时间:2013-05-01 21:03:30

标签: c# regex

我想在换行符之前找到一个没有匹配的引号(“)的开放引号(”),除非换行符后面的字符是开放引号。例如:

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

上面应该找到“bla bla bla

但是,下一个示例不应该匹配,因为下一行以开放引号开头:

He said, “bla bla bla
“bla bla bla.”

仅供参考,我正在使用C#Regex类。提前谢谢。

3 个答案:

答案 0 :(得分:0)

这样的事情会起作用吗?

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

答案 1 :(得分: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);

会这样做。

答案 2 :(得分: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行

我似乎无法摆脱第一场比赛中的新线字符,这可能更容易使用“修剪”声明。