1

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

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

上面应该找到“bla bla bla

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

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

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

4

3 回答 3

1
“(?>[^\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);

会这样做。

于 2013-05-01T21:32:34.100 回答
0

这样的事情会起作用吗?

"[^"]*\n[^"]
于 2013-05-01T21:12:15.013 回答
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 行之前没有双引号

我似乎无法在第一场比赛中摆脱换行符,这可能更容易使用“修剪”语句。

于 2013-05-01T21:53:15.993 回答