【问题标题】:Regex to match closing quote followed by letter正则表达式匹配结束引号后跟字母
【发布时间】:2015-03-27 22:27:57
【问题描述】:

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

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。

更新:在使用了一些测试数据后,我意识到不可能可靠地区分单引号和撇号,因此问题现在应该改为“双引号”而不是“单引号或双引号”

【问题讨论】:

    标签: regex quotes


    【解决方案1】:

    使用此模式,它适用于同一字符串中不跟空格的单引号和双引号

    "(?!\s)(?=(?:(?:[^"]*"){2})*[^"]*$)|'(?!\s)(?=(?:(?:[^']*'){2})*[^']*$)
    

    Demo

    【讨论】:

    • 如果我用 [^\p{L}] 替换 \s 那就太好了,这似乎给了我需要的结果。
    • 或使用\P{L} 代替\s
    【解决方案2】:

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

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

    使用上面的正则表达式,然后用$0<space>替换匹配的字符。

    DEMO

    • (["'])(?:(?!\1).)*\1 匹配单引号或双引号字符串,仅当其后跟,

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

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

    • $行尾锚点。

    【讨论】:

    • 如果我删除“+”或“*”量词(否则 Expresso 对语法的抱怨),这将非常有效。只有行尾锚看起来有点像黑客。理想情况下,我希望它也可以处理生成多行的带引号的字符串。
    • 试试(?s)(["'])(?:(?!\1).)*\1(?=\p{L}(?:\1(?:(?!\1).)*+\1|[^'"])*$)
    • 最好去掉“+”。我将尝试修改它以仅根据我对问题的修订使用双引号。
    • 那么(?s)"[^"]*"(?=\p{L}(?:"[^"]*"|[^"])*$) 就足够了。
    【解决方案3】:

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

      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.
    

    【讨论】:

      【解决方案4】:

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

      ".*?"(.)

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

      你可以重复

      '.*?'(.)

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

      例子:

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

      【讨论】:

        猜你喜欢
        • 2020-10-28
        • 1970-01-01
        • 2014-02-05
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        相关资源
        最近更新 更多