正则表达式匹配结束引号后跟字母

Regex to match closing quote followed by letter

我正在编写一个文本格式化例程,它将在任何适用的地方插入 spaces,我正在努力构建一个匹配右引号(双 或单) 符号后跟一个字母。例如:

first " closing double quote" should not match, but "the second one"should.

此处 space 应仅插入第二个收盘价之后。到目前为止我有

(["']).*?(?![^\p{L}])

打算为反向引用部分使用一个命名组,然后从那里注入我的 space,但这匹配整个

"closing double quote" should not match, but " 

而不是

"the second one"

这里要用什么魔法呢?如果有任何不同,我正在使用 .Net 4.5。

更新:玩过一些测试数据后我意识到不太可能可靠地区分单引号和撇号,所以问题现在应该读作 "double quotes" 而不是 "single or double quotes"

这似乎是一个艰难的过程。给你,

(["'])(?:(?!).)*(?=\p{L}(?:(?:(?!).)*+|[^'"])*$)

使用上面的正则表达式,然后将匹配的字符替换为[=11=]<space>

DEMO

  • (["'])(?:(?!).)* 匹配单引号或双引号字符串,前提是它后跟

  • \p{L} 任何语言的任何字母。

  • (?:(?:(?!).)*+|[^'"])* 双引号字符串 ("foo") 或单引号字符串 ('foo') 或非双引号或单引号 (f,o,o) , 零次或多次。

  • $ 行尾锚点。

如果您的输入中没有任何异常间距,此建议将有效。您可以在引号字符串周围添加空格(支持单引号和双引号:

  var result = Regex.Replace(str, @"(\s*)((['""])(?!).+?)\s*", "  ");

在 Expresso 中测试:

Input:
 - First "closing double quote" should not match, but "the second one"should. 
 - First 'closing double quote' should 'the "second" one'should.

Output:
 - First "closing double quote" should not match, but "the second one" should. 
 - First 'closing double quote' should 'the "second" one' should.

如果你想保持简单,我会使用这样的东西:

".*?"(.)

然后您可以简单地检查捕获组 1 并查看它是否是 space。

你可以重复

'.*?'(.)

如果你想对单引号做同样的事情。

示例:

https://www.debuggex.com/r/5Ibzv2UbhcZXxW9n

使用此模式,它适用于在同一字符串

中不后跟白色 space 的单引号和双引号
"(?!\s)(?=(?:(?:[^"]*"){2})*[^"]*$)|'(?!\s)(?=(?:(?:[^']*'){2})*[^']*$)

Demo