【问题标题】:Regex to capture single quoted strings正则表达式捕获单引号字符串
【发布时间】:2015-08-11 11:51:11
【问题描述】:

我正在使用 .net 正则表达式引擎,我需要一个正则表达式模式来捕获单引号中的子字符串。

我有什么:

(?<!\\p{L})['‘]+(s['’] \\p{Lu}|['’]\\p{L}|[^‘'’\r])*['’]+((?<!s['’])(?! \\p{Lu})|(?!\\p{L}))

我认为它是如何工作的:

  1. 一个非捕获的非字母数字后跟 1 个单引号

    (?&lt;!\\p{L})['‘]+

  2. 0-许多组(“s”+撇号+空格+大写字母或撇号+小写字母或不是撇号或换行符) (s['’] \\p{Lu}|['’]\\p{L}|[^‘'’\r])*

  3. 1-多个结束引号 ['’]+

  4. 最后验证:(不是 s+撇号后面,不是空格+前面的大写字母)或前面不是字母 ((?

它应该如何工作: 例如。 “这是我的‘猴子黑猩猩’农场” 期望的结果:“猴子的黑猩猩” 我目前得到的:'猴子'

说明:'s 不应被视为结束引号。如果 s' 后跟一个空格和另一个大写字母,则也不应该。

问题:为什么引擎在猴子的撇号处停止?在上面的第 2 节中,它应该捕获“'s”,然后继续。引擎很贪心吧?

感谢您的帮助

【问题讨论】:

  • 在这里工作正常regex101.com/r/uF4oY4/2
  • 工作在.Net too,只要你不使用双反斜杠。你是否过度逃避?应该是@"\p{L}""\\p{L}",而不是@"\\p{L}"
  • 我深表歉意,感谢 Maroun 编辑帖子,以便实际看到正则表达式。我在示例中犯了一个错误。 “在这个例子中,‘猴子的黑猩猩’被正确找到了”。 “在此示例中,'Monkey's Chimp(无结束引号)”返回“Monkey”,这是不可取的。在这种情况下,我希望正则表达式不会成功。
  • \B['‘]+(?:s['’] \p{Lu}|['’]\p{L}|[^‘'’\r])*['’]+\B 怎么样? \B 将匹配非单词边界位置,因此不允许任何字母、数字和下划线出现在撇号之前和之后。
  • stribizhev,非常感谢。这绝对是一个进步。我仍然得到我不想要的比赛:EG。 Regex.Match("这是一个'猴子'黑猩猩", "\\B['']+(?:s[''] \\p{Lu}|['']\\p{L}|[ ^'''\\r])*['']+\\B").Value = "'Monkeys'" 因为 s' 后面跟着 "\\p{Lu}" 引擎应该继续寻找结束语(据我所知),永远找不到。我可以看到正则表达式的这一部分正在工作: Regex.Match("This is a 'Monkeys' Chimp", "s[''] \\p{Lu}").Value = "s' C".. ..所以我不确定问题是什么?

标签: regex regex-greedy


【解决方案1】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2013-07-18
    • 2012-08-20
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多