RegEx查找缺少闭引号的段落

本文关键字:段落 查找 RegEx | 更新日期: 2023-09-27 18:11:39

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

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

上面应该找到"bla bla bla

然而,下一个例子不应该匹配,因为下一行以一个左引号开始:

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

仅供参考,我使用c# Regex类。

RegEx查找缺少闭引号的段落

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

这样的东西会起作用吗?

"[^"]*'n[^"]

考虑以下通用正则表达式的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
<标题>收益率h1> 总结
  • ("[^"'n]*)返回双引号
  • 中的所有非",'n"字符
  • ("|'n(?!"))在遇到第一个"或'n"时停止返回
  • (?!")确保'n行后面没有双引号

我似乎无法在第一次匹配时摆脱新的行字符,这可能更容易使用"trim"语句。