【问题标题】:Regex match whole word and punctuation正则表达式匹配整个单词和标点符号
【发布时间】:2014-03-24 08:23:17
【问题描述】:

我有以下字符串:"WordContainingYes. no yes,- no! yes. no" 我需要替换“是”的所有实例,但留下“WordContainingYes”。完好无损的。 我正在使用"\b(yes.)\b",但是当模式内有标点符号时它不起作用。那么有人知道我应该如何匹配整个单词+标点符号吗?

更新

我需要匹配单词后面的任何标点符号。不只是点。

谢谢

【问题讨论】:

  • 我不懂C#,但是grep使用\<\>来匹配单词。
  • 正则表达式需要转义\.
  • @elyashiv 你能详细说明一下吗?
  • \s(yes.) 怎么样?
  • @MElliott 谢谢,您的回答是最接近的。它可以工作,但它也会删除单词之前的空格(在替换时)。知道如何解决吗? :)

标签: c# .net regex


【解决方案1】:

你可以用这个:

(?<=\s)(yes.)

工作正则表达式示例:

http://regex101.com/r/dO3rD9

这对空间使用“lookbehind”,所以当使用替换时,空间不会被替换。

根据上面 OP 的评论:“它可以工作,但它也会删除单词前的空格(在替换时)。知道如何解决这个问题吗?

【讨论】:

  • 谢谢。我猜您之前忘记了 \ ,否则它可以正常工作:) 还有一件事,是否可以在没有标点符号时计算整个单词并在有标点符号时匹配整个单词+标点符号(后一个是您提供的解决方案)。我的意思是,合并 \b(word)\b 和 (?
  • 要写的东西 \b(word)\b OR (?
  • @Davita,是的,如果可以的话,我总是远离单词边界,因为特殊字符的问题。相反,我通常使用:(?&lt;=\s).*?(?=\s)。这将匹配整个单词,无论标点符号或特殊字符如何。
  • 不,我可能没有正确解释,对不起,我不是以英语为母语的人。我的意思是尝试仅按整个单词查找,例如 \b(word)\b 如果找不到(可能是由于标点符号),则恢复为 (?
  • @Davita,哦,你是说这样吗? (?&lt;=\s)(yes[^\s]?) ?这将匹配“是”或“是”。或“是”
【解决方案2】:

试试这个:

\byes\.\b

更新:

\s(yes.?)\s

演示: http://regexr.com?38bnn


P.S. . 是正则表达式的特殊字符,意思是“匹配任何东西”。所以它必须被转义(\.

【讨论】:

  • 我需要匹配任何标点符号,不仅仅是点:)
  • @Davita 可以试试\byes.?\b\syes.?\s 那么?
【解决方案3】:

我认为@Jones 明白了这一点:。 (dot) 是一个特殊符号,需要转义。请尝试以下操作:

\byes\.\b

如果你想获得任何标点符号,你应该使用类似的东西:

\byes[^\w]\b

witch 将匹配 yes 后跟任何非白色字符。您可能想要更精确并实际写出所有标点符号(我假设您不这样做,因为您之前使用过 .)

【讨论】:

    【解决方案4】:

    这个正则表达式应该适合你(假设输入字符串上没有unicode):

    (?<=\b)yes[^a-zA-Z0-9]
    

    【讨论】:

      【解决方案5】:

      您可能会使用标点符号或单词边界。

      注意 - 指定这样的东西时必须小心\byes\.\b
      左侧是 \. 一个非单词,因此要匹配右侧 \b
      必须有一个词 \w 否则将不匹配。

      所以,不要那样做。

      这可能有效。

      \b(yes(?:\p{Punct}|\b))

      稍作修改,您可以像这样排除某些标点符号。
      这将捕获所有非引号标点符号,这些标点符号将作为替换的一部分被删除,或者仅与单词边界匹配。

      \b(yes(?:[^\P{Punct}'"]|\b))

      另一种选择是只包含您想要的标点符号。

      \b(yes(?:[.,+*?-]|\b))

      【讨论】:

        猜你喜欢
        • 2020-02-03
        • 2010-11-15
        • 2012-01-06
        • 1970-01-01
        • 2011-08-07
        • 2017-07-08
        相关资源
        最近更新 更多