正则表达式匹配结束引号后跟字母
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>
。
(["'])(?:(?!).)*
匹配单引号或双引号字符串,前提是它后跟
\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。
你可以重复
'.*?'(.)
如果你想对单引号做同样的事情。
示例:
使用此模式,它适用于在同一字符串
中不后跟白色 space 的单引号和双引号
"(?!\s)(?=(?:(?:[^"]*"){2})*[^"]*$)|'(?!\s)(?=(?:(?:[^']*'){2})*[^']*$)
我正在编写一个文本格式化例程,它将在任何适用的地方插入 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>
。
(["'])(?:(?!).)*
匹配单引号或双引号字符串,前提是它后跟\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。
你可以重复
'.*?'(.)
如果你想对单引号做同样的事情。
示例:
使用此模式,它适用于在同一字符串
中不后跟白色 space 的单引号和双引号"(?!\s)(?=(?:(?:[^"]*"){2})*[^"]*$)|'(?!\s)(?=(?:(?:[^']*'){2})*[^']*$)