【问题标题】:Posix regular expression non capturing groupPosix 正则表达式非捕获组
【发布时间】:2016-11-26 07:25:06
【问题描述】:

我正在 linux 下用 C 语言编写一个简单的 shell。我正在尝试使用带有组捕获的 POSIX 正则表达式来解析用户输入。我的问题是我不想捕获所有组,但 ?: 符号似乎对我有用。

"^(?:[A-Za-z0-9]+)( [A-Za-z0-9]*(?:\"[^\"]*\")*(?:\'[^\']*\')*[A-Za-z0-9]*)*&?$"

【问题讨论】:

  • 它会匹配但不会捕获。您使用的代码在哪里?

标签: c regex linux posix


【解决方案1】:

POSIX Regular Expressions 中不允许使用 (?:..) 或任何其他分组前缀。

有一些工具可以制作语言,例如 ,还有用于 POSIX shell 的简化 语法 is provided by the standard

【讨论】:

    【解决方案2】:

    字符序列(? 未定义 根据9.4.3 ERE Special Characters 部分:

    *+?{

    <asterisk><plus-sign><question-mark><left-brace> 应该是特殊的,除非在括号表达式中使用(请参阅 RE 括号表达式)。以下任何用途都会产生未定义的结果:

    • 如果这些字符首先出现在 ERE 中,或者紧跟在未转义的 <vertical-line><circumflex><dollar-sign><left-parenthesis>

    • 如果 <left-brace> 不是有效区间表达式的一部分(请参阅 ERE 匹配多个字符)

    POSIX RE 实现对于如何处理 undefined 语法有几个选择。这些选择包括根据9.1 Regular Expression Definitions 部分启用扩展语法。所以可以随意实现非捕获组语法:

    [...] 违反指定语法或语义的 RE 会产生 未定义的结果:这可能会导致错误,启用扩展 该 RE 的语法,或使用错误的构造作为文字 要匹配的字符。

    如果您希望将该功能视为未来 POSIX 标准的一部分,您可以在 standard's issue tracker 上提出问题。

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2019-01-12
      • 1970-01-01
      • 2017-04-01
      相关资源
      最近更新 更多