【问题标题】:Regex - dollar sign only matches if another character follows正则表达式 - 美元符号仅在另一个字符之后匹配
【发布时间】:2012-09-29 23:16:35
【问题描述】:

我知道有很多关于正则表达式和美元符号的话题。但我读的那一篇根本没有帮助。我有这个正则表达式\b(foo bar\$)s?\b,它应该匹配foo bar$foo bar$s。问题是,正则表达式只匹配 foo bar$s

对于\b(foo bar)s?\b,它适用于foo barfoo bars

美元是名字的一部分,所以我不能删除它。

有什么想法吗?

【问题讨论】:

  • 请向我们展示演示问题的代码。
  • 一般来说是正则表达式 - 即使问题已经得到解答,我很感兴趣,你还需要什么。
  • 我本来想查看示例输入、所需输出、实际输出以及生成它的代码。从您的帖子中可以看出问题是否与您没有向我们展示的输入或您没有向我们展示的代码有关。 :) (您的正则表达式 匹配字符串 'oh foo bar$baz' 并因此匹配,作为子字符串,您告诉我们的其中一个字符串不匹配。)John Kugelman 对这个问题做了一个善意的猜测结果猜对了。
  • 哦,好吧 - 我认为代码无关紧要,因为它只是正则表达式,对于 javascript、php 或其他任何东西都是一样的。但是你是对的 'oh foo bar$baz' - 当然只有在美元后面有一个空格时才应该匹配。谢谢提示

标签: php regex dollar-sign


【解决方案1】:
\b(foo bar\$)(s\b)?

\b 匹配单词边界,它被定义为一个单词字符后跟一个非单词字符,反之亦然。 $ 是一个非单词字符,所以 $\b<space> 是一个失败的匹配,因为 \b 两边都被非单词字符包围。

解决方案是仅在 s 之后查找第二个 \b

【讨论】:

  • 你是对的 - 它有效。我想如果我转义 $ php 会将其作为单词字符处理。谢谢你的好解释
  • 顺便说一句,如果我没记错的话,拉丁语 8859-1 中的“单词字符”基本上是 [A-Za-z0-9_](加上变音符号、锐音符、坟墓等等)——所以像 $- 不算数。
猜你喜欢
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
相关资源
最近更新 更多