我正在编写一个文本格式化例程,它将在适用的地方插入空格,我正在努力构建一个正则表达式,它将匹配结束引号(双或单个)符号后跟一个字母。例如:
first " closing double quote" should not match, but "the second one"should.
此处应仅在第二个结束报价后插入空格。到目前为止我已经
了(["']).*?\1(?![^\p{L}])
打算使用一个命名组作为反向引用部分并从那里注入我的空间,但这匹配整个
"closing double quote" should not match, but "
而不是
"the second one"
我在这里应用什么魔法?如果这有任何不同,我正在使用.Net 4.5。
更新:玩过一些测试数据后,我意识到将单引号与撇号区分开来是不可能的,所以问题现在应该是“双引号”而不是“单引号或双引号”
答案 0 :(得分:1)
这看起来很艰难。你去吧,
(["'])(?:(?!\1).)*\1(?=\p{L}(?:\1(?:(?!\1).)*+\1|[^'"])*$)
使用上述正则表达式,然后将匹配的字符替换为$0<space>
。
(["'])(?:(?!\1).)*\1
仅匹配单引号或双引号字符串,
\p{L}
任何语言的任何来信。
(?:\1(?:(?!\1).)*+\1|[^'"])*
双引号字符串(&#34; foo&#34;)或单引号字符串(&#39; foo&#39;)或不是双引号或单引号(f,o, o),零次或多次。
$
行锚的结束。
答案 1 :(得分:1)
使用此模式,它适用于单引号和双引号引号,后面没有相同字符串中的空格
"(?!\s)(?=(?:(?:[^"]*"){2})*[^"]*$)|'(?!\s)(?=(?:(?:[^']*'){2})*[^']*$)
答案 2 :(得分:0)
如果您的输入中没有任何异常间距,此建议将起作用。您可以在带引号的字符串周围添加空格(支持单引号和双引号:
var result = Regex.Replace(str, @"(\s*)((['""])(?!\3).+?\3)\s*", " $2 ");
在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.
答案 3 :(得分:0)
如果你想保持简单,我会使用这样的东西:
".*?"(.)
然后,您可以简单地检查捕获组1并查看它是否是空格。
您可以重复
'.*?'(.)
如果你想对单引号做同样的事情。
示例: