【问题标题】:Regex match exact words正则表达式匹配确切的单词
【发布时间】:2017-12-23 05:22:51
【问题描述】:

我希望我的正则表达式匹配 ?ver?v,但 ?version

这是我目前所拥有的:$parts = preg_split( "(\b\?ver\b|\b\?v\b)", $src );

我认为问题可能在于我如何逃脱?

【问题讨论】:

  • 请添加两个或三个示例输入,以便未来的 SO 读者可以在上下文中看到您的要求。
  • 你所说的“确切的词”不是很清楚,特别是因为? 不是一个词字符。你应该解释一个词的确切界限。
  • @mickmackusa:没关系,总是不清楚(幸运的是!)。
  • @Fjott 请显示一些示例数据,因为这可以确定模式是否正确。

标签: php regex preg-split


【解决方案1】:

您的模式尝试匹配前面带有单词 char 的 ?,由于没有,因此您没有匹配项。

使用以下模式:

'/\?v(?:er)?\b/'

regex demo

模式详情

  • \? - 文字 ? char
  • v(?:er)? - vver
  • \b - 单词边界(即在vver 之后必须有非单词字符(不是数字、字母或_)或字符串结尾)。

请注意,您不需要第一个(初始)单词边界,因为它已经存在于?(非单词字符)和v(单词字符)之间。如果? 是可选的,您将需要一个单词边界。

【讨论】:

    【解决方案2】:

    试试下面的正则表达式模式;

    (\?v(?:\b|(?:er(?!sion))))
    

    Demo

    这将允许?ver?v,但如果?ver 后跟sion,则会使用负前瞻来防止匹配,就像你的情况?version

    【讨论】:

    • 你怎么知道目标子串在行尾结束?您的模式实际上可能不正确,但在 OP 提供一些示例字符串之前我们不会知道。这与 Wiktor 的正确模式无关。
    • OP 确实提供了示例字符串 - 他说“我希望我的正则表达式匹配 ?ver?v,但不匹配 ?version”。
    • 但是,如果这就是 OP 的意思并且他们没有很好地表达它,我现在已经编辑了我的答案,因为它对原始解决方案是免费的。感谢您指出了这一点! :)
    • 既然您了解了单词边界的要求,那么您的答案现在是 Wiktor 答案的效率较低的版本并且没有用处。您没有尝试优化您的模式,因此您没有向用户展示精致的模式。 \?v(?:\b|(?:er(?!sion)))\?v(?:\b|er(?!sion)) 是您发布的模式的更高效版本。
    【解决方案3】:

    在上述答案的基础上,要匹配一个单词而不是另一个单词的一部分,您可以尝试 \b(WORD_HERE)\b 在你的情况下是 \b(\?ver)\b 这将允许ver 并阻止version average

    【讨论】:

    • 为什么要使用捕获组? \? 之前的单词边界是没有用的,如果它位于字符串的开头或者之前有空格(即它不会匹配字符串?verDemo
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多