我想在换行符之前找到一个没有匹配的右引号(”)的开引号(“),除非换行符后面的字符是一个开引号。例如:
He said, “bla bla bla
She didn't listen.
上面应该找到“bla bla bla
但是,下一个示例不应匹配,因为下一行以开放引号开头:
He said, “bla bla bla
“bla bla bla.”
仅供参考,我正在使用 C# 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
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 行之前没有双引号我似乎无法在第一场比赛中摆脱换行符,这可能更容易使用“修剪”语句。