【问题标题】:POSIX Regular Expressions: Excluding a word in an expression?POSIX正则表达式:排除表达式中的单词?
【发布时间】:2013-02-28 22:11:40
【问题描述】:

我正在尝试使用可在 C 程序代码中使用的 POSIX(扩展)正则表达式创建正则表达式。

具体来说,我想出了以下内容,但是,我想在匹配的表达式中排除“http”这个词。经过一番搜索,POSIX 看起来并不明显可以捕获特定的字符串。我在下面的示例中使用了一种称为“负面观察”的东西(即 (?!http:) )。但是,我担心这可能仅适用于 POSIX 以外的方言中定义的正则表达式。 是否允许负前瞻? POSIX 中是否允许使用逻辑 NOT 运算符(即 ! )?

工作正则表达式示例:

href|HREF|src[[:space:]]<em>=[[:space:]]</em>\"(?!http:)[^\"]+\"[/]

如果我不能像在其他方言中那样使用否定前瞻,我可以对上面的正则表达式做些什么来过滤掉特定的单词“http:”?理想情况下,有没有任何方法没有逆逻辑并最终在此过程中创建一个可笑的长正则表达式? (我上面的那个已经很长了,如果可能的话,我希望它看起来不会更混乱)

[注意:我已经在 Stack Overflow 中咨询过其他相关主题,但最相关的主题似乎只是“一般”地问这个问题,这意味着给出的答案并不一定意味着它们是 POSIX 风格的 ==> 在另一个线程或两个,我已经看到上面的 (?!insertWordToExcludeHere) 否定前瞻,但我担心它只适用于 PHP。)

[注 2:我也会采用任何 POSIX 正则表达式短语,我们将不胜感激。有没有人对过滤掉“http:”的正则表达式的外观以及它如何适合我当前的正则表达式提出建议,替换 (?!http:)?]

【问题讨论】:

  • 其实,如果需要检查字符串中特定位置(开始、结束、特定部分之后)是否缺少某个单词,可以匹配反向模式,但是可以' 不匹配在字符串内任何位置不包含某些多字符子字符串的字符串。

标签: regex regex-negation negative-lookahead posix-ere


【解决方案1】:

根据http://www.regular-expressions.info/refflavors.html,前瞻和后瞻不在 POSIX 风格中。

如果您的问题太复杂而无法清晰地表示为正则表达式,您可以考虑考虑词法分析(标记化)和解析。

【讨论】:

  • 嗯,上面我贴出来的正则表达式和我需要的差不多,减去字符串“http:”的排除。您对如何使用 POSIX 将“http”排除在我的正则表达式中有何建议?换句话说,关于如何在 POSIX 中合并一个可以过滤掉“http:”但可以放在我当前正则表达式中的表达式的任何建议?
  • ([^h"][^"]+|h[^t"][^+]+|ht[^t"][^t"]+|... 这样的长表达式可以实现,但我不推荐它。我赞同 Patashu 关于词法分析的建议,并特别建议您寻找现有的用于解析 HTML 的库。它将获得其他详细信息,例如属性可以有单引号和双引号,看起来像属性的东西可能是正文文本或评论或 CDATA 部分等的一部分。
  • 虽然我完全同意你们两个的观点,但我将不得不为这个长表格想出一个正则表达式,并在当前负面展望的位置插入。你是什么对我下面的表达有什么想法?它的灵感来自 SO 上的一个论坛帖子,其中有人想过滤掉“树”,但我修改它以过滤掉“http”:^([^h]|(h[^t])|(ht[^t] )|(htt[^p]))*($|(h($|(t($|p$)))))
猜你喜欢
  • 2016-05-09
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
相关资源
最近更新 更多