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